Ошибка jwks-rsa при получении ключей подписи - JwksError: Forbidden

Я пытаюсь динамически проверить 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, и мне не ясно, какая часть этого мне будет «запрещена»?

Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
0
0
138
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение моего экземпляра этой ошибки! Эмитент 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!
});

Другие вопросы по теме