【发布时间】:2014-08-11 15:11:58
【问题描述】:
我一直在深入研究堆栈溢出,但无法解决我的问题。我正在尝试访问一个使用摘要但没有成功的 API,我的同事也无法确定问题所在。我碰壁了,来到 Stack Overflow 来问我的问题。
这是我的验证码:
var https = require("https"),
crypto = require('crypto'),
_ = require('underscore');
var options = {
host: 'api.example.com',
port: 80,
path: '/path/to/uri/',
method: 'GET',
accept: 'application/json',
acceptEncoding: 'gzip, deflate',
connection: 'keep-alive',
rejectUnauthorized: false,
requestCert: true,
agent: false
};
var username = 'username',
password = 'httppassword';
var req = https.get(options, function(res) {
res.setEncoding('utf-8');
console.log(res.url);
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
var data = "";
res.on('data', function (chunk) {
data = data + chunk;
});
res.on('end', function(){
console.log(data);
var challengeParams = parseDigest(res.headers['www-authenticate']);
console.log(challengeParams);
var ha1 = crypto.createHash('md5').update(username + ':' + challengeParams.realm + ':' + password).digest('hex');
var ha2 = crypto.createHash('md5').update('GET:' + options.path).digest('hex');
var response = crypto.createHash('md5').update(ha1 + ':' + challengeParams.nonce + ':1::auth:' + ha2).digest('hex');
var authRequestParams = {
username : username,
realm : challengeParams.realm,
nonce : challengeParams.nonce,
uri : options.path,
qop : challengeParams.qop,
response : response,
nc : 1,
cnonce : ''
};
options.headers = { 'Authorization' : renderDigest(authRequestParams) };
console.log(options);
https.get(options, function(res) {
console.log("STATUS: " + res.statusCode);
console.log("HEADERS: " + JSON.stringify(res.headers));
res.setEncoding('utf-8');
var content = '';
res.on('data', function(chunk) {
content += chunk;
}).on('end', function() {
console.log(content);
});
})
});
});
req.on('error' ,function(err){
console.log("request");
console.log(err);
});
req.write('data\n');
req.write('data\n');
req.end();
这是 API 发回的挑战标头
{ realm: 'API realm',
domain: 'https:/api.example.com/',
qop: 'auth',
nonce: 'UZ43b0FWC9591pMjy1i6H2okVwgMbDVO6fcgcQ' }
编辑:
我认为对于那些希望回答这个问题的人来说,提供我实际发送回 API 的内容会很有帮助,所以就在这里。
{ host: 'api.example.com',
port: 80,
path: '/path/to/uri/',
method: 'GET',
accept: 'application/json',
acceptEncoding: 'gzip, deflate',
connection: 'keep-alive',
rejectUnauthorized: false,
requestCert: true,
agent: false,
headers: { Authorization: 'Digest username="uname", realm="API realm", nonce="UZ43b0FWC9591pMjy1i6H2okVwgMbDVO6fcgcQ", uri="/path/to/uri", qop="auth", response="09c536e22bca031cdbcb289e4065064a", nc="1", cnonce=""' } }
【问题讨论】:
-
您遇到的错误是什么?什么不起作用?您是否有 HTTP 日志来查看服务器事务的样子(使用 Charles 或 Wireshark 之类的东西?)
-
对不起,我忘了说!我收到 401 错误。我不会担心什么不起作用,这就是我来到 SO 的原因,但我的授权代码中的某些内容显然是错误的,否则我不会遇到这个问题。不,我没有使用任何 HTTP 日志。我现在就这样做。
-
我会记录 HTTP 事务并确保 HTTP 授权请求看起来像您期望的那样 :)。身份验证尝试的服务器日志中还有什么?是否有消息解释为什么它被拒绝
-
服务器日志是什么意思?在我响应挑战标头后,它会向我发回具有相同挑战标头的相同标头(当然具有不同的随机数)。此外,据我所知,由于使用 SSL,读取 HTTPS 流量非常繁琐。有没有更好的方法来调试我的程序?
-
还不错。使用 Charles,或者使用 node-ssl-root-cas 或在文件顶部设置
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"。而且,是的,您正在与之交谈的服务器应该有一个日志文件,其中说明为什么您通常会收到 401 错误消息。
标签: node.js https digest digest-authentication