无法获得摘要身份验证以与 Node.js 一起使用

2023-12-14

我正在尝试使用来自 Gathercontent.com 的 API 来使用 Node js 进行简单的(!)摘要身份验证。

一切似乎都正常,除了我仍然收到如下所示的“错误凭据”响应:

{ success: false, error: 'Wrong Credentials!' }

代码如下所示:

var https = require('https'),
    qs = require('querystring');
apikey = "[my api key goes in here]",
    pwd = "[my password goes in here]",
    crypto = require('crypto');


module.exports.apiCall = function () {

    var options = {
        host:'abcdefg.gathercontent.com',
        port:443,
        path:'/api/0.1/get_pages_by_project/get_me',
        method:'POST',
        headers:{
            "Accept":"application/json",
            "Content-Type":"application/x-www-form-urlencoded"
        }
    };

    var req = https.request(options, function (res) {

        res.on('data', function (d) {
            var creds = JSON.parse(d);


            var parsedDigest = parseDigest(res.headers['www-authenticate']);
            console.log(parsedDigest);
            var authopts = {
                host:'furthercreative.gathercontent.com',
                port:443,
                path:'/api/0.1/get_pages_by_project/get_me',
                method:'POST',
                headers:{
                    "Accept":"application/json",
                    "Content-Type":"application/x-www-form-urlencoded",
                    "Authorization" : getAuthHeader(parsedDigest, apikey, parsedDigest['Digest realm'], pwd)
                }
            };

            console.log(authopts);
            console.log('\n\n\n');
            var req2 = https.request(authopts, function (res2) {
                console.log("statusCode: ", res2.statusCode);
                console.log("headers: ", res2.headers);


                res2.on('data', function (d2) {
                    var result = JSON.parse(d2);

                });
            });

            req2.end();



        });

    });


    req.write('id=1234');

    req.end();

    req.on('error', function (e) {
        console.error(e);
    });

};

function parseDigest(s){

    var parts = s.split(',');
    var obj = {};
    var nvp = '';

    for(var i = 0; i < parts.length; i++){

        nvp = parts[i].split('=');
        obj[nvp[0]] = nvp[1].replace(/"/gi, '');
    }



    return obj;
}

function getAuthHeader(digest, apikey, realm, pwd){
    var md5 = crypto.createHash('md5');
    var s = '';

    var nc = '00000001';
    var cn = '0a4f113b';

    var HA1in = apikey+':'+realm+':'+pwd;
    md5 = crypto.createHash('md5');
    md5.update(HA1in);
    var HA1out = md5.digest('hex');

    var HA2in = 'POST:/api/0.1/get_pages_by_project/get_me';
    md5 = crypto.createHash('md5');
    md5.update(HA2in);
    var HA2out = md5.digest('hex');

    md5 = crypto.createHash('md5');
    var respIn = HA1out + ':' + digest.nonce + ':'+nc+':'+cn+':'+digest.qop+':'+ HA2out;
    md5.update(respIn);
    var resp = md5.digest('hex');


    s = [   'Digest username="',apikey,'", ',
        'realm="',digest['Digest realm'],'", ',
        'nonce="',digest.nonce,'", ',
        'uri="/api/0.1/get_pages_by_project/get_me", ',
        'cnonce="',cn,'", ',
        'nc="',nc,'", ',
        'qop="',digest.qop,'", ',
        'response="',resp,'", ',
        'opaque="',digest.opaque,'"'].join('')

    return s;
}

我会尝试卷曲它,但我不知道该怎么做!

任何帮助表示赞赏!


我发现有几个问题可能与您的问题相关。由于对 GatherContent 的实现一无所知,很难判断哪些是真正的罪魁祸首。如果您粘贴“WWW-Authenticate”标头的示例,则提供具体帮助会容易得多。

因此,我猜测实际原因是什么,但这里有一些您应该解决的实际问题,以符合规范(即保护它在未来不会损坏,因为服务器开始做的事情略有不同):

  • in the Authorization您正在创建的标题,删除双引号 around nc,也许还有qop
  • 我不知道什么qop值收集内容正在使用。如果它是auth-int,那么您还必须将哈希 HTTP 正文附加到HA2, see 规范#3.2.2.3- 此外,他们可能会指定以逗号分隔的 qop 值列表供您选择 - 或服务器可能不会发送值qop at all,即他们使用 HTTP 摘要身份验证的最基本形式,其中您的实现将违反spec,因为那时你不被允许例如寄一个cnonce, nc etc.
  • 你尝试通过以下方式获得该领域parsedDigest['Digest realm'], i.e. 你假设realm是初始属性之后的第一个属性Digest关键词。情况可能是这样,也可能不是,但您不应该依赖它(修改您的parseDigest剥离字符串的函数"Digest "在分割其余部分之前)
  • 你使用的方式parsedDigest,你假设Digest总是以这种方式大写,并且realm, nonce, etc.始终为小写。根据规范,这些都是不区分大小写

几个不相关的问题:

  • 服务器真的强迫你使用吗Digest authentication?这是 HTTPS,所以你不妨这样做Basic authentication,这更容易,而且使用 HTTPS,同样安全。 (在检查了收集内容后在这里回答自己:基本身份验证显然是不可能)
  • 正如我在对你的问题的评论中提到的,cnonce对于每个请求应该是随机的,特别是,您不应该从维基百科,这会让你更容易受到攻击(但这不是问题,因为在你的情况下所有数据都通过 SSL 传输)

关于如何卷曲它 - 试试这个:

curl --data 'id=1234' --digest --user "apikey:pwd" https://abcdefg.gathercontent.com:443/api/0.1/get_pages_by_project/get_me
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法获得摘要身份验证以与 Node.js 一起使用 的相关文章

随机推荐