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

如何为Keycloak中的每个访问令牌设置自定义过期时间?

在Keycloak中生成自定义有效期的访问令牌

原生请求参数支持情况

Keycloak不支持直接在令牌生成请求(如授权码流、密码流的请求)中传入duration这类参数来指定令牌有效期,令牌的默认有效期由领域(Realm)或客户端(Client)的配置项(如Access Token Lifespan)控制。

可行替代方案

以下是几种更贴合需求的方案,无需全局修改默认有效期,也不用自行处理有效期逻辑:

1. 脚本协议映射器(推荐)

通过自定义脚本映射器,根据请求参数动态覆盖令牌的exp(过期时间)声明:

  • 登录Keycloak管理控制台,进入目标领域
  • 导航到Client Scopes → 新建或选择目标客户端范围 → 切换到Mappers标签 → 点击Create
  • 选择映射器类型为Script Mapper,设置名称(如Custom Token Expiry),在Script字段中编写逻辑:
    // 获取请求中的duration参数
    var duration = context.getHttpRequest().getParameter("duration");
    if (duration) {
        var expiresIn = parseInt(duration);
        // 校验参数,避免过大的值
        if (expiresIn > 0 && expiresIn <= 3600) { // 限制最大1小时,可按需调整
            var currentTime = Math.floor(Date.now() / 1000);
            // 覆盖exp声明
            token.getOtherClaims().put("exp", currentTime + expiresIn);
        }
    }
    
  • 将该映射器关联到需要自定义有效期的客户端(在客户端的Client Scopes配置中添加)
  • 后续请求令牌时,在请求中带上duration=1000参数即可生成对应有效期的令牌

2. 自定义认证器(灵活扩展)

如果需要更复杂的逻辑(比如基于用户角色、客户端类型控制有效期),可以编写自定义Authenticator:

  • 创建Java类实现Authenticator接口,在authenticate方法中读取请求参数,动态设置令牌的有效期
  • 将代码打包成jar,部署到Keycloak的providers目录,重启Keycloak
  • 在认证流程中添加该自定义认证器,即可在认证过程中调整令牌有效期

3. 授权服务(UMA场景)

如果你的应用使用Keycloak的Authorization Services(UMA),可以在权限请求中通过expiresIn参数指定令牌有效期:

  • 在请求权限令牌时,携带expiresIn=1000参数,Keycloak会生成对应有效期的授权令牌

注意事项

  • 务必对duration参数做合法性校验(如最大值限制),防止生成超长有效期令牌带来的安全风险
  • 仅允许可信客户端使用该功能,可通过客户端的权限配置或映射器的适用范围控制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:47:24