Перейти к содержимому
ecdsa.com
Nimbus JOSE + JWT (Java)Java

Сообщение об ошибке

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.

Почему это происходит

Как исправить

  1. 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. 2.

    Или задайте его в application.yml

    В Spring Boot та же настройка доступна как `jws-algorithms`.

    yaml
    spring:
      security:
        oauth2:
          resourceserver:
            jwt:
              issuer-uri: https://issuer.example.com/realms/main
              jws-algorithms: ES256

Связанные ошибки

Открыть всю базу ошибок подписей