Изменение 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)
Любые предложения о том, как реализовать этот пример с простым общим секретом вместо асимметричных ключей?