如何使用 Jsonwebtoken NPM 包验证 Azure AD 颁发的 JWT 令牌?

Kur*_*oZ7 1 node.js jwt

我正在尝试使用 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);
Run Code Online (Sandbox Code Playgroud)

请注意,在上面的代码中,我使用了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
});
Run Code Online (Sandbox Code Playgroud)

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

var decoded = jwt.decode(token, {complete: true});
var header = decoded.header
Run Code Online (Sandbox Code Playgroud)

Kur*_*oZ7 6

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

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)  
    });
Run Code Online (Sandbox Code Playgroud)