能否通过代码修改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
相关产品推荐
相关产品推荐

