如何为keycloak中的每个访问令牌提供自定义过期时间?

问题描述 投票:0回答:2

我正在使用 Keycloak 开发一个应用程序,我想生成具有自定义生命周期的访问令牌。是否可以将指定所需寿命的参数传递给令牌生成请求?例如,我希望能够传递参数duration: 1000来生成将在1000秒后过期的访问令牌。

如果这不可能,有什么解决方法吗?

一种可能性是创建一个存储所需寿命的自定义声明。然而,这需要我编写自己的函数来处理生命周期,这可能并不理想。

这个问题中提到的另一种可能性是使用管理API更改默认生命周期,但这不是重点。我想保留大多数代币的默认生命周期。

如有任何帮助,我们将不胜感激。

jwt keycloak openid-connect access-token identity-management
2个回答
1
投票

我实现了为利用自定义声明生成的每个访问令牌建立个性化过期时间的能力。在正文中,与其他凭据一起,我以表单 url 编码格式包含了自定义声明。

声明使用指定的键从请求中检索值。在 org.keycloak.representations.IDToken 内部,存在一个名为 exp(long) 的函数,它本质上覆盖了 keycloak 领域的默认过期时间。

在传递时间之前,需要将其转换为Unix纪元格式,这是JWT(JSON Web Tokens)用于存储时间的时间格式。

以下代码表示 setClaim 函数内的实现,该函数用于创建自定义声明。如果您不熟悉创建自定义声明的过程,可以参考这篇文章获取指导。

@Override
protected void setClaim(IDToken token, ProtocolMapperModel mappingModel,
                        UserSessionModel userSession, KeycloakSession keycloakSession,
                        ClientSessionContext clientSessionCtx) {
    int claimValue = 0;
    // Get encoded value from request
    String encodedClaimValue = keycloakSession.getContext().getHttpRequest().getDecodedFormParameters().getFirst("custom_exp");
    if (encodedClaimValue != null) {
        claimValue = Integer.parseInt(org.keycloak.common.util.Encode.decode(encodedClaimValue));
        // Get the current local date and time
        LocalDateTime currentTime = LocalDateTime.now();
        // Add minutes to the current time
        LocalDateTime futureTime = currentTime.plusMinutes(claimValue);
        // Convert the future time to Unix epoch timestamp
        long unixEpochTimestamp = futureTime.toEpochSecond(ZoneOffset.UTC);
        // Override default Expiration
        token.exp(unixEpochTimestamp);
    }
}

0
投票

这个问题解决了吗?我有名为“timeout_idle”的组级别属性,以分钟为单位设置。 我希望该组中的用户在此属性中指定的时间之后从 UI 注销,而不是在领域级别 SSO 空闲超时中设置的内容。

我应该做什么以及我应该在哪里编写代码?

© www.soinside.com 2019 - 2024. All rights reserved.