Сообщение об ошибке
"alg" (Algorithm) Header Parameter value not allowed
jose (JavaScript) — JOSEAlgNotAllowed, code ERR_JOSE_ALG_NOT_ALLOWED
Что это означает
Заголовок alg токена указывает алгоритм, которого нет в списке разрешённых алгоритмов (параметр algorithms), переданном в jwtVerify. jose отклоняет токен ещё до того, как выполняется какая-либо криптография. Это сделано намеренно: заголовок alg — входные данные, которые контролирует атакующий, и выбирать алгоритм должна проверяющая сторона, а не токен.
Почему это происходит
Список разрешённых алгоритмов расходится с издателем
частоИздатель перешёл с RS256 на ES256 (или добавил новый ключ подписи с другим алгоритмом), а проверяющая сторона по-прежнему жёстко задаёт старое семейство алгоритмов. Каждый новый токен отклоняется, пока список разрешённых алгоритмов и ключи не обновят вместе — причём сбои начинаются ровно в ту минуту, когда издатель выкатил изменение: это полезная улика при разборе логов.
Алгоритм записан в списке разрешённых иначе
иногдаСравнение — это точное совпадение с именем JOSE с учётом регистра: «es256», «ECDSA», «P-256» или «SHA256withECDSA» в файле конфигурации никогда не совпадут с заголовком, где указано «ES256». (Если ключ не подходит к заголовку — например, ключ P-384 для токена ES256 или JWK с другим собственным alg, — ошибка будет другой: TypeError с описанием ключа.)
Враждебный или неверно настроенный клиент подставляет другой alg
редкоЭта проверка существует именно для того, чтобы останавливать токены с alg, равным «none», или с неожиданным значением HS*. Если в логах появляются чужие алгоритмы, считайте это прощупыванием, а не ошибкой, под которую нужно подстраиваться.
Как исправить
- 1.
Согласуйте список разрешённых алгоритмов, ключ и конфигурацию издателя
Посмотрите на заголовок и приведите все три в соответствие. На время миграции принимайте оба алгоритма, каждый со своим ключом, который выбирается по kid из JWKS.
js import { decodeProtectedHeader, jwtVerify } from "jose"; console.log(decodeProtectedHeader(token)); // { alg: "ES256", kid: "..." } await jwtVerify(token, jwks, { algorithms: ["ES256"] }); - 2.
Держите список разрешённых алгоритмов как можно короче
Не «исправляйте» эту ошибку, перечисляя все алгоритмы подряд. Безопасное итоговое состояние — одно значение на каждый тип токена; то же самое говорит RFC 8725 (JWT Best Current Practices).
js // good: exactly what your issuer signs with { algorithms: ["ES256"] } // bad: defeats the protection this error provides { algorithms: ["ES256", "RS256", "HS256", "PS256"] }