Сообщение об ошибке
Signed JWT rejected: Another algorithm expected, or no matching key(s) found
Также выводится как
- com.nimbusds.jose.proc.BadJOSEException: Signed JWT rejected: Another algorithm expected, or no matching key(s) found
- org.springframework.security.oauth2.jwt.BadJwtException: An error occurred while attempting to decode the Jwt: Signed JWT rejected: Another algorithm expected, or no matching key(s) found
Nimbus JOSE + JWT (Java) — BadJOSEException from DefaultJWTProcessor; also surfaced by Spring Security's NimbusJwtDecoder
Что это означает
Селектор ключей Nimbus не вернул для этого токена ни одного ключа-кандидата: либо `alg` токена не входит в число алгоритмов, которые принимает селектор, либо ни один ключ в наборе JWK не совпадает с `kid` и типом ключа токена. Nimbus намеренно не сообщает, какой из двух случаев произошёл. В Spring Security причина очень часто в том, что `NimbusJwtDecoder` по умолчанию ожидает RS256, а издатель подписывает токены ES256.
Почему это происходит
Проверяющая сторона ожидает RS256
часто`NimbusJwtDecoder` в Spring Security использует RS256, если вы не задали алгоритмы (в новых версиях он может определить их по JWKS издателя). Keycloak, Auth0, Azure AD B2C и другие могут подписывать токены ES256/PS256.
kid токена нет в наборе JWK
частоНовый ключ после ротации, который ещё не опубликован, закешированный набор JWK или URL набора JWK, принадлежащий другому издателю или окружению.
Метаданные ключа исключают его
иногдаJWK с `use: "enc"`, другим `alg` или другим типом ключа (набор ключей RSA для токена ES256) отбрасываются механизмом сопоставления.
Как исправить
- 1.
Укажите декодеру, каким алгоритмом подписывает издатель
`jwsAlgorithm(...)` (или `jwsAlgorithms(...)`) в билдере заменяет RS256, используемый по умолчанию. Включайте в список только те алгоритмы, которыми издатель действительно подписывает.
java @Bean JwtDecoder jwtDecoder() { return NimbusJwtDecoder.withIssuerLocation("https://issuer.example.com/realms/main") .jwsAlgorithm(SignatureAlgorithm.ES256) // the issuer's algorithm; RS256 is only the default .build(); } - 2.
Или задайте его в application.yml
В Spring Boot та же настройка доступна как `jws-algorithms`.
yaml spring: security: oauth2: resourceserver: jwt: issuer-uri: https://issuer.example.com/realms/main jws-algorithms: ES256