【问题标题】:Probleme Authentification with nodejs and soap使用nodejs和soap进行身份验证
【发布时间】:2016-09-26 18:19:42
【问题描述】:

我使用一个使用 PasswordDigest 身份验证的 SOAP。 我成功地使用了这个库:https://github.com/vpulim/node-soap

我在 Debian 上使用 nodejs 版本 v0.10.29 运行此代码,它可以工作。

现在我需要让它在带有 nodejs v6.6.0 的 windows 计算机上运行,​​它不再工作了。

我收到以下消息:

无法对安全令牌进行身份验证或授权

我怀疑加密库有问题,这段代码可能是:

"use strict";
var crypto = require('crypto');
exports.passwordDigest = function passwordDigest(nonce, created, password) {
  // digest = base64 ( sha1 ( nonce + created + password ) )
  var pwHash = crypto.createHash('sha1');
  var rawNonce = new Buffer(nonce || '', 'base64').toString('binary');
  pwHash.update(rawNonce + created + password);
  return pwHash.digest('base64');
};

来自https://github.com/vpulim/node-soap/blob/master/lib/utils.js

【问题讨论】:

    标签: javascript node.js web-services soap


    【解决方案1】:

    好的,这就是我的解决方法:

    SOAP 库具有构建 WSSE 安全标头的功能,该标头位于soap/lib/security/templates/WSSecurity.js 中。

    对我来说,它放置在标题中的 UsernameToken 与soapUI 正在使用并实际获得结果的用户名令牌不一致(在我的示例中)。

    原始码:

     "<wsse:UsernameToken xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\" wsu:Id=\"SecurityToken-" + created + "\">
    

    而我需要的是:

    <wsse:UsernameToken wsu:Id="UsernameToken-<token>">
    

    为了获得正确的令牌,我使用了来自 npm (https://www.npmjs.com/package/wsse) 的 WSSE 库。

    我所要做的就是包含包,按照自述文件定义令牌:

    const wsse = require('wsse');
    const token = wsse({ username: '<username>', password: '<password>' })
    

    然后为正确的令牌调用 token.getNonce() 并为标头中的 EncodingType 属性调用 token.getPasswordDigest()。

    之后一切都按预期进行。

    希望有帮助!

    【讨论】:

      【解决方案2】:

      我已经使用@MTM 回答推送了模块。 请看一下

      https://www.npmjs.com/package/wssecurity-soap

      修复它的代码,以防有人想要查看(它与soap wssecurity auth 实现相同,包括修复)

      var crypto = require('crypto');
      var wsse = require('wsse');
      
      var validPasswordTypes = ['PasswordDigest', 'PasswordText'];
      
      function WSSecurity(username, password, options) {
        options = options || {};
        this._username = username;
        this._password = password;    
        if (typeof options === 'string') {
          this._passwordType = options ? 
           options : 
           'PasswordText';
          options = {};
        } else {
          this._passwordType = options.passwordType ? 
           options.passwordType : 
           'PasswordText';
        }
      
        if (validPasswordTypes.indexOf(this._passwordType) === -1) {
          this._passwordType = 'PasswordText';
        }
      
        this._hasTimeStamp = options.hasTimeStamp || typeof options.hasTimeStamp === 'boolean' ? !!options.hasTimeStamp : true;
        if (options.hasNonce != null) {
          this._hasNonce = !!options.hasNonce;
        }
        this._hasTokenCreated = options.hasTokenCreated || typeof options.hasTokenCreated === 'boolean' ? !!options.hasTokenCreated : true;
        if (options.actor != null) {
          this._actor = options.actor;
        }
        if (options.mustUnderstand != null) {
          this._mustUnderstand = !!options.mustUnderstand;
        }
      }
      
      WSSecurity.prototype.toXML = function() {
        this._token = wsse({ 
          username: this._username, 
          password: this._password 
        })
        function getDate(d) {
          function pad(n) {
            return n < 10 ? '0' + n : n;
          }
          return d.getUTCFullYear() + '-'
            + pad(d.getUTCMonth() + 1) + '-'
            + pad(d.getUTCDate()) + 'T'
            + pad(d.getUTCHours()) + ':'
            + pad(d.getUTCMinutes()) + ':'
            + pad(d.getUTCSeconds()) + 'Z';
        }
        var now = new Date(this._token.getCreated());
        var created = this._token.getCreated() ; 
        var timeStampXml = '';
        if (this._hasTimeStamp) {
          var expires = getDate( new Date(now.getTime() + (1000 * 600)) );
          timeStampXml = "<wsu:Timestamp wsu:Id=\"Timestamp-"+created+"\">" +
            "<wsu:Created>"+created+"</wsu:Created>" +
            "<wsu:Expires>"+expires+"</wsu:Expires>" +
            "</wsu:Timestamp>";
        }
      
        var password, nonce;
        if (this._hasNonce || this._passwordType !== 'PasswordText') {
          var nHash = crypto.createHash('sha1');
          nHash.update(created + Math.random());
          nonce = nHash.digest('base64');
        }
        if (this._passwordType === 'PasswordText') {
          password = "<wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText\">" + this._password + "</wsse:Password>";
          if (nonce) {
            password += "<wsse:Nonce EncodingType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary\">" + nonce + "</wsse:Nonce>";
          }
        } else {
          password = "<wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest\">" + this._token.getPasswordDigest() + "</wsse:Password>" +
            "<wsse:Nonce EncodingType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary\">" + this._token.getNonceBase64() + "</wsse:Nonce>";
        }
      
        return "<wsse:Security " + (this._actor ? "soap:actor=\"" + this._actor + "\" " : "") +
          (this._mustUnderstand ? "soap:mustUnderstand=\"1\" " : "") +
          "xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\">" +
          timeStampXml +
          "<wsse:UsernameToken wsu:Id=\"UsernameToken-" + created +"\">"+
          "<wsse:Username>" + this._username + "</wsse:Username>" +
          password +
          (this._hasTokenCreated ? "<wsu:Created>" + created + "</wsu:Created>" : "") +
          "</wsse:UsernameToken>" +
          "</wsse:Security>";
      };
      
      module.exports = WSSecurity;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-18
        • 2011-04-25
        • 2020-02-28
        • 1970-01-01
        • 2012-04-23
        • 2017-09-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多