Message d’erreur
Signed JWT rejected: Another algorithm expected, or no matching key(s) found
Également affiché sous la forme
- 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
Ce que cela signifie
Le sélecteur de clés de Nimbus n’a renvoyé aucune clé candidate pour ce jeton : soit l’`alg` du jeton ne fait pas partie des algorithmes qu’accepte le sélecteur, soit aucune clé du jeu de clés JWK ne correspond au `kid` et au type de clé du jeton. Nimbus ne précise volontairement pas lequel des deux cas s’applique. Derrière Spring Security, il s’agit très souvent de l’algorithme RS256 par défaut de `NimbusJwtDecoder` face à un émetteur qui signe en ES256.
Pourquoi cela se produit
Le vérificateur attend RS256
fréquenteLe `NimbusJwtDecoder` de Spring Security utilise RS256, sauf si vous configurez des algorithmes (ou si, dans les versions récentes, il les découvre à partir du JWKS de l’émetteur). Keycloak, Auth0, Azure AD B2C et d’autres peuvent signer en ES256/PS256.
Le kid du jeton ne figure pas dans le jeu de clés JWK
fréquenteUne clé issue d’une rotation et pas encore publiée, un jeu de clés JWK en cache, ou une URL de jeu de clés JWK appartenant à un autre émetteur ou à un autre environnement.
Les métadonnées de la clé l’excluent
occasionnelleLes JWK avec `use: "enc"`, un autre `alg` ou un autre type de clé (un jeu de clés RSA pour un jeton ES256) sont écartées par le filtre de correspondance.
Comment corriger l’erreur
- 1.
Indiquer au décodeur l’algorithme utilisé par l’émetteur
`jwsAlgorithm(...)` (ou `jwsAlgorithms(...)`) appelé sur le builder remplace la valeur par défaut RS256. Limitez la liste aux algorithmes que l’émetteur utilise réellement.
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.
Ou le configurer dans application.yml
Spring Boot expose le même réglage sous le nom `jws-algorithms`.
yaml spring: security: oauth2: resourceserver: jwt: issuer-uri: https://issuer.example.com/realms/main jws-algorithms: ES256