Сообщение об ошибке
jwt issuer invalid. expected: https://login.example.com/
После «expected:» стоит значение, которое вы задали в настройках; если издатели переданы массивом, значения перечисляются через запятую.
jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify()
Что это означает
Утверждение `iss` токена не равно параметру `issuer`, который вы передали в `jwt.verify()` (или в токене вообще нет `iss`). Текст после «expected:» — это заданное вами значение, а не значение из токена. jsonwebtoken сравнивает строки точно: подпись верна, но токен заявляет, что пришёл из источника, которому ваш сервис не доверяет.
Почему это происходит
Тот же издатель, другое написание
частоКосая черта в конце, http и https, имя хоста в верхнем регистре или пропущенный сегмент пути (`/realms/main`, `/v2.0`, `/oauth2/default`). Поставщики удостоверений записывают `iss` точно так же, как `issuer` в своём документе обнаружения; проверяющая сторона должна использовать ту же строку.
В токене нет утверждения iss
иногдаВнутренние сервисы выдачи токенов часто не добавляют `iss`. Если параметр `issuer` задан, отсутствие утверждения приводит к тому же сообщению: сравнивать не с чем.
Токен действительно от другого издателя
иногдаТокен из другого тенанта, окружения или от другого провайдера. Здесь ошибка означает, что защита работает: продолжайте отклонять такие токены.
Как исправить
- 1.
Выведите iss токена в виде JSON
`JSON.stringify` делает видимыми незаметные различия: косую черту в конце, пробельные символы, другой путь. Затем скопируйте `issuer` провайдера из `/.well-known/openid-configuration` в свою конфигурацию.
js const { iss } = jwt.decode(token) ?? {}; console.log(JSON.stringify(iss)); // compare byte for byte with your issuer option - 2.
Принимайте нескольких издателей только осознанно
Параметр `issuer` принимает массив. Используйте его для плановой миграции между двумя вариантами написания или между издателями, которыми вы управляете, и привязывайте к каждому издателю его собственные ключи.
js jwt.verify(token, publicKey, { algorithms: ["ES256"], issuer: ["https://login.example.com/", "https://login.example.com"], // during a migration only });