You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Authorization Server 1.0.0创建无过期时间AccessToken问题

解决Spring Authorization Server 1.0.0创建永不过期Access Token的问题

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:40:10