Node.js中使用http.client进行摘要身份验证时出现问题

Node.js中使用http.client进行摘要身份验证时出现问题,node.js,digest-authentication,Node.js,Digest Authentication,我尝试在使用http时实现摘要请求。每次获取“摘要身份验证失败”消息时,获取“摘要身份验证失败”:( 这段代码有什么问题吗?有几个问题: res.on('data',fn)中的回调不一定被调用,因为响应不一定包含正文,只包含头。因此,请改用res.on('end',fn) 解析摘要头导致了一个非常特殊的对象,因为参数可以被引用,并且可以包含空格(可以转义) 写入身份验证标头的处理方式相同 以下是一个对我有用的版本: var hashlib = require('hashlib'),

我尝试在使用http时实现摘要请求。每次获取“摘要身份验证失败”消息时,获取“摘要身份验证失败”:(

这段代码有什么问题吗?

有几个问题:

  • res.on('data',fn)中的回调不一定被调用,因为响应不一定包含正文,只包含头。因此,请改用res.on('end',fn)
  • 解析摘要头导致了一个非常特殊的对象,因为参数可以被引用,并且可以包含空格(可以转义)
  • 写入身份验证标头的处理方式相同
以下是一个对我有用的版本:

var hashlib = require('hashlib'),
    http = require('http'),
    _ = require('underscore')

var username = 'user';
var password = 'pwd';

var options = {
  'host' : 'host',
  'path' : '/path'
};

http.get(options, function(res) {
    res.setEncoding('utf-8');
    res.on('end', function() {
        var challengeParams = parseDigest(res.headers['www-authenticate'])
        var ha1 = hashlib.md5(username + ':' + challengeParams.realm + ':' + password)
        var ha2 = hashlib.md5('GET:' + options.path)
        var response = hashlib.md5(ha1 + ':' + challengeParams.nonce + ':1::auth:' + ha2)
        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) }
        http.get(options, function(res) {
          res.setEncoding('utf-8')
          var content = ''
          res.on('data', function(chunk) {
            content += chunk
          }).on('end', function() {
            console.log(content)
          })
        });
    });
})

function parseDigest(header) {  
  return _(header.substring(7).split(/,\s+/)).reduce(function(obj, s) {
    var parts = s.split('=')
    obj[parts[0]] = parts[1].replace(/"/g, '')
    return obj
  }, {})  
}
function renderDigest(params) {
  var s = _(_.keys(params)).reduce(function(s1, ii) {
    return s1 + ', ' + ii + '="' + params[ii] + '"'
  }, '')
  return 'Digest ' + s.substring(2);
}

无法
npm安装hashlib
,我使用节点中的加密模块创建md5哈希

var ha1=crypto.createHash('md5').update(新缓冲区(用户名+':'+challengeParams.realm+':'+密码)).digest('base64');

var hashlib = require('hashlib'),
    http = require('http'),
    _ = require('underscore')

var username = 'user';
var password = 'pwd';

var options = {
  'host' : 'host',
  'path' : '/path'
};

http.get(options, function(res) {
    res.setEncoding('utf-8');
    res.on('end', function() {
        var challengeParams = parseDigest(res.headers['www-authenticate'])
        var ha1 = hashlib.md5(username + ':' + challengeParams.realm + ':' + password)
        var ha2 = hashlib.md5('GET:' + options.path)
        var response = hashlib.md5(ha1 + ':' + challengeParams.nonce + ':1::auth:' + ha2)
        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) }
        http.get(options, function(res) {
          res.setEncoding('utf-8')
          var content = ''
          res.on('data', function(chunk) {
            content += chunk
          }).on('end', function() {
            console.log(content)
          })
        });
    });
})

function parseDigest(header) {  
  return _(header.substring(7).split(/,\s+/)).reduce(function(obj, s) {
    var parts = s.split('=')
    obj[parts[0]] = parts[1].replace(/"/g, '')
    return obj
  }, {})  
}
function renderDigest(params) {
  var s = _(_.keys(params)).reduce(function(s1, ii) {
    return s1 + ', ' + ii + '="' + params[ii] + '"'
  }, '')
  return 'Digest ' + s.substring(2);
}