Наш сервер авторизации (Auth0), по сообщениям, не меняет набор JWK (возможно, когда-либо?). Для повышения производительности мы хотели бы кэшировать ключи с удаленного сервера аутентификации гораздо дольше, чем жестко заданное значение по умолчанию (5 минут) в DefaultJWKSetCache , поскольку эти ключи необходимы для проверки токенов для всех запросов, и каждый раз, когда они запрашиваются, добавляет значительную задержку. Обратите внимание, что класс библиотеки JWT-декодера - final
.
. Путь наименьшего сопротивления для уменьшения количества запросов к серверу авторизации, по-видимому, заключается в использовании прокси с локальным маршрутом, который будет обрабатывать кэширование. Есть ли лучший способ?
Версия: Spring Boot 2.2.5
// Relevant imports (omitted) from:
// import org.springframework.security.oauth2.core
// import org.springframework.security.oauth2.jwt
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Value("${auth0.audience}")
private String audience;
@Value("${spring.security.oauth2.resourceserver.jwt.issuer-uri}")
private String issuer;
@Override
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/api/**").authenticated()
.anyRequest().permitAll()
.and()
.cors()
.and()
.csrf()
.disable()
.oauth2ResourceServer()
.jwt();
// @formatter:on
}
@Bean
JwtDecoder jwtDecoder() {
NimbusJwtDecoder jwtDecoder = (NimbusJwtDecoder) JwtDecoders.fromOidcIssuerLocation(issuer);
OAuth2TokenValidator<Jwt> audienceValidator = new AudienceValidator(audience);
OAuth2TokenValidator<Jwt> withIssuer = JwtValidators.createDefaultWithIssuer(issuer);
OAuth2TokenValidator<Jwt> withAudience = new DelegatingOAuth2TokenValidator<>(withIssuer, audienceValidator);
jwtDecoder.setJwtValidator(withAudience);
return jwtDecoder;
}
}