«Подписанный JWT отклонен» при перезапуске сервера ресурсов Spring

Я получаю сообщение «Подписанный JWT отклонен: ожидается другой алгоритм или не найдены соответствующие ключи» на сервере ресурсов Spring, когда я перезапускаю сервер ресурсов Spring.

Ошибка исходит от DefaultJwtProcessor

      JWTClaimsSet claimsSet = extractJWTClaimsSet(signedJWT);

        List<? extends Key> keyCandidates = selectKeys(signedJWT.getHeader(), claimsSet, context);

        if (keyCandidates == null || keyCandidates.isEmpty()) {
            throw new BadJOSEException("Signed JWT rejected: Another algorithm expected, or no matching key(s) found");
        }

Я следовал образцу, представленному на сервере авторизации Spring.

Как я могу решить эту проблему?

      Spring authorization server

@Bean
    @Lazy
    public JWKSource<SecurityContext> jwkSource() {
        final RSAKey rsaKey = generateRsa();
        final JWKSet jwkSet = new JWKSet(rsaKey);

        return new ImmutableJWKSet<>(jwkSet);
    }

public static RSAKey generateRsa() {
            final KeyPair keyPair = generateRsaKey();
            final RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
            final RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
            // @formatter:off
            return new RSAKey.Builder(publicKey)
                .privateKey(privateKey)
                .keyID(UUID.randomUUID().toString())
                .build();
            // @formatter:on
        }

static KeyPair generateRsaKey() {
        KeyPair keyPair;

        try {
            final KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");

            keyPairGenerator.initialize(2048);
            keyPair = keyPairGenerator.generateKeyPair();
        } catch (Exception ex) {
            throw new IllegalStateException(ex);
        }
        return keyPair;
    }
      Spring resource server

private JwtDecoder jwtDecoder(final String issuerUri) {
        return NimbusJwtDecoder.withIssuerLocation(issuerUri).jwsAlgorithm(SignatureAlgorithm.RS256).build();
    }

1 ответ

Ключи в примере «Приступая к работе» генерируются во время запуска. Вы можете попробовать загрузить ключи из постоянного места, например файла (пример) или базы данных (пример).

Другие вопросы по тегам