Mensagem de erro
Signed JWT rejected: Another algorithm expected, or no matching key(s) found
Também aparece 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
O que significa
O seletor de chaves do Nimbus não retornou nenhuma chave candidata para este token: ou o `alg` do token não está entre os algoritmos que o seletor aceita, ou nenhuma chave do conjunto de chaves JWK corresponde ao `kid` e ao tipo de chave do token. O Nimbus deliberadamente não diz qual dos dois aconteceu. Com o Spring Security, muitas vezes isso é o RS256 padrão do `NimbusJwtDecoder` diante de um emissor que assina com ES256.
Por que acontece
O verificador espera RS256
comumO `NimbusJwtDecoder` do Spring Security usa RS256, a menos que você configure os algoritmos (ou que ele os descubra no JWKS do emissor, nas versões mais novas). Keycloak, Auth0, Azure AD B2C e outros podem assinar com ES256/PS256.
O kid do token não está no conjunto de chaves JWK
comumUma chave gerada na rotação e ainda não publicada, um conjunto de chaves JWK em cache ou uma URL de conjunto de chaves JWK de outro emissor ou ambiente.
Os metadados da chave a excluem
ocasionalAs JWKs com `use: "enc"`, com um `alg` diferente ou de outro tipo de chave (um conjunto de chaves RSA para um token ES256) são descartadas pelo filtro de correspondência.
Como corrigir
- 1.
Dizer ao decodificador qual algoritmo o emissor usa
`jwsAlgorithm(...)` (ou `jwsAlgorithms(...)`) no builder substitui o padrão RS256. Mantenha na lista só os algoritmos que o emissor realmente usa.
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 configurar no application.yml
O Spring Boot expõe a mesma configuração como `jws-algorithms`.
yaml spring: security: oauth2: resourceserver: jwt: issuer-uri: https://issuer.example.com/realms/main jws-algorithms: ES256