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

能否通过代码修改Keycloak中Access/Refresh Token的过期时间?

可以通过代码修改Keycloak令牌过期时间吗?

当然可以,主要有两种实现路径,分别对应全局持久化配置和动态个性化调整:

1. 修改客户端/领域级别的默认令牌过期时间

这是最常用的方案,通过Keycloak Admin API修改客户端或领域的配置,修改后所有新生成的令牌都会遵循新的过期时间。

Java代码示例(使用Keycloak Admin Client)

先引入Maven依赖(Gradle同理),然后编写代码:

// 初始化Admin Client
Keycloak keycloak = KeycloakBuilder.builder()
        .serverUrl("http://localhost:8080/auth")
        .realm("master")
        .username("admin")
        .password("admin")
        .clientId("admin-cli")
        .resteasyClient(new ResteasyClientBuilder().connectionPoolSize(10).build())
        .build();

// 获取目标领域和客户端
RealmResource realm = keycloak.realm("your-target-realm");
ClientResource client = realm.clients().get("your-client-uuid");
ClientRepresentation clientConfig = client.toRepresentation();

// 修改令牌过期时间(单位:秒)
clientConfig.setAccessTokenLifespan(3600); // Access Token设为1小时
clientConfig.setRefreshTokenLifespan(86400); // Refresh Token设为1天
clientConfig.setRefreshTokenMaxLifespan(604800); // Refresh Token最大有效期设为7天

// 提交更新
client.update(clientConfig);

keycloak.close();

curl调用Admin API示例

先获取管理员访问令牌,再发起更新请求:

# 先获取管理员token
curl -X POST \
  http://localhost:8080/auth/realms/master/protocol/openid-connect/token \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'username=admin&password=admin&grant_type=password&client_id=admin-cli'

# 用拿到的access_token更新客户端配置
curl -X PUT \
  http://localhost:8080/auth/admin/realms/your-target-realm/clients/your-client-uuid \
  -H 'Authorization: Bearer YOUR_ADMIN_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "accessTokenLifespan": 3600,
    "refreshTokenLifespan": 86400,
    "refreshTokenMaxLifespan": 604800
  }'

2. 动态修改单个令牌的过期时间

如果需要给特定用户、会话或请求设置差异化的过期时间,可以通过自定义Keycloak SPI实现:

自定义TokenEnhancer示例

实现TokenEnhancer接口,在令牌生成阶段动态调整过期时间:

public class CustomTokenExpiryEnhancer implements TokenEnhancer {

    @Override
    public AccessToken enhance(AccessToken accessToken, TokenEnhancerContext context) {
        // 针对特定用户调整过期时间
        UserModel user = context.getAuthenticationSession().getAuthenticatedUser();
        if ("vip-user".equals(user.getUsername())) {
            accessToken.expiresIn(1800); // Access Token设为30分钟
            // 同步调整Refresh Token过期时间
            context.getAuthenticationSession().setRefreshTokenExpiration(43200);
        }
        return accessToken;
    }
}

将这个类打包成JAR,放到Keycloak的providers目录,重启Keycloak后,在目标领域的「Token Settings」中启用这个自定义增强器即可。

注意事项

  • 全局配置修改仅对新生成的令牌生效,已颁发的令牌不会受影响。
  • 自定义SPI需要遵循Keycloak的扩展开发规范,确保权限和逻辑安全。
  • Admin API调用必须使用拥有领域管理权限的令牌,避免权限泄露。

内容的提问来源于stack exchange,提问作者sid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 22:40:24