Изменение Spring oauth2ResourceServer JWT ex. использование одного секрета вместо пары ключей вызывает исключение «Не удалось выбрать ключ подписи JWK»

Я пытаюсь реализовать серверную часть Spring Boot Rest с JWT-безопасностью на основе нового сервера авторизации Springs и этого примера: https://github.com/spring-projects/spring-security-samples/tree/main/servlet/ весна-загрузка/java/jwt/логин

Он использует асимметричные ключи для подписи и проверки токенов, что кажется излишним, поскольку и аутентификация (где генерируется токен), и авторизация (проверенная) происходят на одном сервере. Итак, чтобы упростить развертывание (просто передать один секрет через переменную среды), я пытался переписать его, чтобы использовать один общий секрет . В примере кода реализованы два компонента Bean: один для создания JwtEncoder (с использованием закрытого ключа RSA) и один для JWTDecoder (с использованием соответствующего открытого ключа). Я переписал декодер, как описано в главе 15 книги «Spring Security в действии», поэтому я предполагаю, что это должно работать, посколькуNimbusJwtDecoderпредлагаетwithSecretKeyметод.

      //Will eventually come via an environment variable
static byte[] secret = "j8IoV1jF67".getBytes();
@Bean
JwtDecoder jwtDecoder() {
  //      return NimbusJwtDecoder.withPublicKey(this.key).build();
  SecretKey theKey = new SecretKeySpec(secret, 0, secret.length, "AES");
  return NimbusJwtDecoder.withSecretKey(theKey).build();
}

Я реализовал кодировщик, который решает проблему , например так (код, закомментированный, является исходным кодом, использующим закрытый ключ RSA:

      @Bean
JwtEncoder jwtEncoder() {
  // JWK jwk = new RSAKey.Builder(this.key).privateKey(this.priv).build();
  // JWKSource<SecurityContext> jwks = new ImmutableJWKSet<>(new JWKSet(jwk));
  // return new NimbusJwtEncoder(jwks);
  SecretKey originalKey = new SecretKeySpec(secret, 0, secret.length, "AES");
  JWKSource<SecurityContext> immutableSecret = new ImmutableSecret<SecurityContext>(originalKey);
  return new NimbusJwtEncoder(immutableSecret);
}

Когда я вхожу (через конечную точку POST/token), строка, использующая кодировщик:

      return this.encoder.encode(JwtEncoderParameters.from(claims)).getTokenValue();

Выдает это исключение

      org.springframework.security.oauth2.jwt.JwtEncodingException: An error occurred while attempting to encode the Jwt: Failed to select a JWK signing key
    at org.springframework.security.oauth2.jwt.NimbusJwtEncoder.selectJwk(NimbusJwtEncoder.java:134)
    at org.springframework.security.oauth2.jwt.NimbusJwtEncoder.encode(NimbusJwtEncoder.java:108)

Любые предложения о том, как реализовать этот пример с простым общим секретом вместо асимметричных ключей?

0 ответов

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