我正在尝试使用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。我不明白jwt.verify函数如何将'header'参数传递给getKey。以下是我检索到的标头。如何在jwt.verify中将此标头传递给getKey?
var decoded = jwt.decode(token, {complete: true});
var header = decoded.header
答案 0 :(得分:0)
如果您可以间接使用 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