Spring Authorization Server 1.0.0创建无过期时间AccessToken问题
Spring Authorization Server 1.0.0的TokenSettings强制要求accessTokenTimeToLive必须大于Duration.ZERO,直接设置Duration.ZERO会触发IllegalArgumentException。要实现永不过期的Access Token,可通过以下两种方式处理:
方案1:设置极长的过期时间(折中方案)
用实际场景中几乎不会过期的时长模拟“永不过期”,比如设置为100年:
TokenSettings.builder() .accessTokenTimeToLive(Duration.ofDays(36500)) // 100年有效期 .build();
这种方式无需修改框架逻辑,简单易实现,适合大多数需求场景。
方案2:自定义TokenGenerator覆盖过期时间逻辑
通过自定义OAuth2TokenGenerator,绕过框架默认的过期时间校验,直接生成无过期时间的Access Token:
1. 实现自定义AccessTokenGenerator
@Component public class CustomAccessTokenGenerator implements OAuth2TokenGenerator<OAuth2AccessToken> { private final OAuth2TokenGenerator<OAuth2AccessToken> defaultGenerator; public CustomAccessTokenGenerator(OAuth2TokenGenerator<OAuth2AccessToken> defaultGenerator) { this.defaultGenerator = defaultGenerator; } @Override public OAuth2AccessToken generate(OAuth2TokenContext context) { OAuth2AccessToken originalToken = defaultGenerator.generate(context); // 创建新的Access Token,将过期时间设为null return new OAuth2AccessToken( OAuth2AccessToken.TokenType.BEARER, originalToken.getTokenValue(), Instant.now(), null // 无过期时间 ); } }
2. 配置替换默认的TokenGenerator
@Bean public RegisteredClientRepository registeredClientRepository() { RegisteredClient registeredClient = RegisteredClient.withId(UUID.randomUUID().toString()) .clientId("your-client-id") .clientSecret("{noop}your-client-secret") .clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC) .authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS) .scope("your-scope") .tokenSettings(TokenSettings.builder() // 只需设置一个大于0的时长,自定义Generator会覆盖此配置 .accessTokenTimeToLive(Duration.ofHours(1)) .build()) .build(); return new InMemoryRegisteredClientRepository(registeredClient); } @Bean public OAuth2TokenGenerator<?> tokenGenerator(CustomAccessTokenGenerator customAccessTokenGenerator) { return new DelegatingOAuth2TokenGenerator( customAccessTokenGenerator, new OAuth2RefreshTokenGenerator() ); }
注意:部分客户端或认证组件可能不兼容无过期时间的Token,需提前测试兼容性。
内容的提问来源于stack exchange,提问作者deepti
相关产品推荐
相关产品推荐

