【问题标题】:How to use Jsonwebtoken NPM package to verify JWT token issued by Azure AD?如何使用 Jsonwebtoken NPM 包验证 Azure AD 颁发的 JWT 令牌?
【发布时间】:2019-07-31 03:34:27
【问题描述】:

我正在尝试使用 jsonwebtoken NPM 包来验证 Azure Active Directory 颁发的 JWT 令牌。以下是我写的node.js代码:

  var jwt = require('jsonwebtoken');
  var token = '<valid JWT token>';
  var x5cString = '<x5cSTring>';
  var publicKey = '-----BEGIN CERTIFICATE-----\n' + x5cString + '\n-----END CERTIFICATE-----';

    var verifiedToken = jwt.verify(token, publicKey) //, verifyOptions);

请注意,在上面的代码中,我使用了来自https://login.microsoftonline.com/common/discovery/keys 的实际 x5c 字符串。这工作正常,我得到了预期的结果。但是,作为公钥的 X5C 字符串一直在变化。我正在尝试了解如何自动获取此公钥。

编辑

我在 Jsonwebtoken NPM 包网站上找到了一些示例代码。在此代码中,signingKey 是我想要的。以下是代码。

var jwksClient = require('jwks-rsa');
var client = jwksClient({
  jwksUri: 'https://login.microsoftonline.com/common/discovery/keys'
});
function getKey(header, callback){
  client.getSigningKey(header.kid, function(err, key) {
    var signingKey = key.publicKey || key.rsaPublicKey;
    callback(null, signingKey);
  });
}

jwt.verify(token, getKey, options, function(err, decoded) {
  console.log(decoded.foo) // bar
});

在上面的代码中,jwt.verify 调用了getKey,它以header 和callback 作为参数。我不明白 jwt.verify 函数如何将 'header' 参数传递给 getKey。以下是我检索到的标题。如何将此标头传递给 jwt.verify 中的 getKey?

var decoded = jwt.decode(token, {complete: true});
var header = decoded.header

【问题讨论】:

    标签: node.js jwt


    【解决方案1】:

    好的,我已经找到了解决方案。以下是我拥有的最终代码。

    var jwksClient = require('jwks-rsa');
    var jwt = require('jsonwebtoken');
    
        token = 'valid JWT token';
        var decoded = jwt.decode(token, {complete: true});
        var header = decoded.header
    
        var verifyOptions = {
         algorithms: ['RS256'],
         header: decoded.header
    
      };
    
    
        var client = jwksClient({
          jwksUri: 'https://login.microsoftonline.com/common/discovery/keys'
        });
        function getKey(header, callback){
          client.getSigningKey(header.kid, function(err, key) {
            var signingKey = key.publicKey || key.rsaPublicKey;
            callback(null, signingKey);
          });
        }
    
        jwt.verify(token, getKey, verifyOptions, function(err, decoded) {
          //This will display the decoded JWT token.
          console.log(decoded)  
        });
    

    【讨论】:

      【解决方案2】:

      如果你可以间接使用 jsonwebtoken,你可以使用

      请参阅 https://github.com/justinlettau/azure-ad-verify-token/blob/master/src/verify.ts 了解 https://www.npmjs.com/package/azure-ad-verify-token 是如何做到这一点的,代码与您自己的答案相得益彰!

      还有较旧的https://www.npmjs.com/package/azure-jwt-verify(未维护,并且存在一些安全漏洞),其功能非常相似。

      对于官方推荐的库,请在此处尝试https://docs.microsoft.com/en-us/azure/active-directory/develop/reference-v2-libraries#web-application

      【讨论】:

        猜你喜欢
        • 2016-12-02
        • 2017-03-29
        • 2023-03-18
        • 1970-01-01
        • 2020-07-08
        • 1970-01-01
        • 2019-04-18
        • 1970-01-01
        • 2019-05-13
        相关资源
        最近更新 更多