Я пытаюсь динамически проверить JWT, используя jsonwebtoken
и jwks-rsa
, и получаю запрещенную ошибку. Пример, который я использую, в основном прямо из документации.
const client = jwksClient({
jwksUri: 'https://a-site/.well-known/jwks.json'
});
function getKey(header, callback){
client.getSigningKey(header.kid, function(err, key) {
if(err){
console.log(err); // This returns "JwksError: Forbidden"
}
var signingKey = key.publicKey || key.rsaPublicKey;
callback(null, signingKey);
});
}
const opts = {
audience: 'aud value',
issuer: "iss value"
};
return jwt.verify(token, getKey, opts, (err, decoded) => {
return decoded;
});
Я могу нажать URI в своем браузере и увидеть ключи, но сообщение об ошибке не дает мне много информации, оно просто гласит JwksError: Forbidden
. Любые предложения, что может быть причиной? Я относительно новичок в JWT, и мне не ясно, какая часть этого мне будет «запрещена»?
Я нашел решение моего экземпляра этой ошибки! Эмитент openId требовал (но не упомянул!) установить заголовок user-agent
. В моем случае это могло иметь любое значение, если оно присутствовало в заголовке, поэтому следующее изменение вышеизложенного решило мою проблему.
const client = jwksClient({
jwksUri,
requestHeaders: {
'user-agent': 'some-user-agent'
}
});
Полный рабочий пример:
const client = jwksClient({
jwksUri,
requestHeaders: {
'user-agent': 'some-user-agent'
}
});
function getKey(header, callback){
client.getSigningKey(header.kid, function(err, key) {
if(err){
console.log(err); // This no longer returns an error
}
var signingKey = key.publicKey || key.rsaPublicKey;
callback(null, signingKey);
});
}
const opts = {
audience: 'aud value',
issuer: "iss value"
};
return jwt.verify(token, getKey, opts, (err, decoded) => {
return decoded; // Returns the successfully decoded key!
});