Mensaje de error
Signed JWT rejected: Another algorithm expected, or no matching key(s) found
También se muestra como
- 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
Qué significa
El selector de claves de Nimbus no devolvió ninguna clave candidata para este token: o el `alg` del token no es uno de los algoritmos que acepta el selector, o ninguna clave del conjunto de claves JWK coincide con el `kid` y el tipo de clave del token. Nimbus evita a propósito decir cuál de las dos cosas ocurrió. Con Spring Security, muy a menudo se trata del RS256 predeterminado de `NimbusJwtDecoder` frente a un emisor que firma con ES256.
Por qué ocurre
El verificador espera RS256
frecuenteEl `NimbusJwtDecoder` de Spring Security usa RS256 salvo que configures los algoritmos (o, en versiones más recientes, que los descubra a partir del JWKS del emisor). Keycloak, Auth0, Azure AD B2C y otros pueden firmar con ES256/PS256.
El kid del token no está en el conjunto de claves JWK
frecuenteUna clave rotada que aún no se ha publicado, un conjunto de claves JWK en caché o una URL del conjunto de claves JWK que pertenece a otro emisor o a otro entorno.
Los metadatos de la clave la excluyen
ocasionalEl comparador (matcher) descarta las JWK con `use: "enc"`, con otro `alg` o con otro tipo de clave (un conjunto de claves RSA para un token ES256).
Cómo solucionarlo
- 1.
Indicar al decodificador qué algoritmo usa el emisor
`jwsAlgorithm(...)` (o `jwsAlgorithms(...)`) en el builder sustituye el RS256 predeterminado. Limita la lista a los algoritmos que usa realmente el emisor.
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.
O configurarlo en application.yml
Spring Boot ofrece el mismo ajuste como `jws-algorithms`.
yaml spring: security: oauth2: resourceserver: jwt: issuer-uri: https://issuer.example.com/realms/main jws-algorithms: ES256