如何在 Keycloak 中指定刷新令牌的生命周期

Posted

技术标签:

【中文标题】如何在 Keycloak 中指定刷新令牌的生命周期【英文标题】:How to specify refresh tokens lifespan in Keycloak 【发布时间】:2019-02-02 01:09:19 【问题描述】:

Keycloak 刷新令牌的生命周期为 1800 秒:

“refresh_expires_in”:1800

如何指定不同的过期时间?在 Keycloak 管理界面中,只能指定访问令牌的生命周期:

【问题讨论】:

【参考方案1】:

刷新令牌的生命周期由 SSO 会话空闲设置控制。 30 分钟 = 30 * 60 = 1800 秒(refresh_expires_in 值)

【讨论】:

实际上,它要复杂得多。每个字段之间有很多关系,您可以在 3 个不同的地方覆盖它。为了清楚起见,Keycloak 是一个地狱。但对我来说,我必须将Client Session Idle 设置为 0,Client Session Max 设置为 0,SSO Session Idle 设置为 999 天。之后,我可以使用 Access Token Lifespan 控制访问令牌超时并使用 SSO Session Max 刷新令牌超时。花了我 1 个小时玩所有变量。 SSO Session IdleAccess Token Lifespan 将被占用,以时间较短者为准 @KubaŠimonovský 将 SSO Session Idle 设置为 999 的问题你基本上失去了空闲功能 @KubaŠimonovský 我将 Client Session Idle 设置为 0,Client Session Max 设置为 0,SSO Session Idle 设置为 12 小时,但空闲会话仍然仅在 30 分钟后到期。还需要什么? 谢谢,@KubaŠimonovský 这很有帮助。 在最新版本中,在编写 15.0.2 时,refresh_expires_in 的值一直为 0。为了解决这个问题,我不得不将 Offline Session Max Limited 切换到“On”。跨度> 【参考方案2】:

在 v11.0.3 中,在客户端的高级设置下,没有 SSO 会话空闲设置(不确定这些设置是否刚刚被重命名、移动,或者是管理界面中其他地方可用的领域设置),所以开始使用默认客户端设置,您可以指定 Client Session Max 来控制刷新令牌生命周期,而无需更改其他持续时间设置(访问令牌生命周期如您所愿继续)。证据:调整设置并检查 refresh_expires 作为响应。

【讨论】:

【参考方案3】:

刷新令牌的生命周期由 Realm 设置的“令牌”选项卡中的“客户端会话最大值”参数定义。

也可以在客户端设置页面的“高级设置”菜单下的单个客户端级别上覆盖它。

如 Keycloak 文档中所述:https://www.keycloak.org/docs/latest/server_admin/#_timeouts

客户端会话最大值

刷新令牌之前的最长时间是 过期和失效。它允许更短的规范 刷新令牌的超时比会话超时。它可以是 覆盖单个客户端。它是一个可选配置,并且 如果未设置为大于 0 的值,则使用相同的空闲超时集 在 SSO Session Max 配置中。

【讨论】:

【参考方案4】:

正如@Kuba Šimonovský 在 cmets 中指出的那样,accepted answer 缺少其他重要因素:

实际上,它要复杂得多。

TL;DR 可以推断refresh token lifespan 将等于(SSO Session IdleClient Session IdleSSO Session MaxClient Session Max)中的最小值。 p>


在花了一些时间研究这个问题之后,现在回过头来看这个帖子,我觉得以前的答案很简短,无法详细解释发生了什么(甚至有人可能会争辩说他们实际上是错误的)。

现在假设我们只有SSO Session IdleSSO Session Max

SSO Session Max > SSO Session Idle 在这种情况下,refresh token lifetimeSSO Session Idle 相同。为什么?因为如果应用程序在SSO Session Idle 时间内处于空闲状态,则用户将注销,这就是刷新令牌绑定到该值的原因。每当应用程序请求新令牌时,refresh token lifetimeSSO Session Idle 倒计时值都将再次重置; 和SSO Session Max SSO Session Idle 那么refresh token lifetime 将与SSO Session Max 相同。为什么?因为无论用户做什么(空闲与否),用户都会在 SSO Session Max 时间后注销,因此刷新令牌会绑定到该值。

从这里我们得出结论,刷新令牌的生命周期绑定到SSO Session IdleSSO Session Max 这两个值中的最小值。

这两个值都与单点登录 (SSO) 相关。我们仍然需要考虑领域设置的Client Session IdleClient Session Max 字段的值,当未设置时,它们分别与SSO Session IdleSSO Session Max 相同。

如果设置了这些值,在刷新令牌的上下文中,它们将覆盖来自 SSO Session IdleSSO Session Max 的值,但前提是它们低于来自 SSO Session IdleSSO Session Max 的值。

让我们看看以下示例:SSO Session Idle = 1800 秒,SSO Session Max = 10 小时和:

    Client Session Idle = 600 秒,Client Session Max = 1 小时。在这种情况下,refresh token lifespanClient Session Idle 相同; Client Session Idle = 600 秒,Client Session Max = 60 秒。在这种情况下,refresh token lifespanClient Session Max 相同。 Client Session Idle = 1 天,Client Session Max = 10 天。在这种情况下,refresh token lifespanSSO Session Idle 相同;

因此,简而言之,您可以推断出refresh token lifespan 将等于(SSO Session IdleClient Session IdleSSO Session MaxClient Session Max)之间的最小值。

因此,您可以简单地使用Client Session Max 来控制刷新令牌寿命的先前答案的说法是错误的。只需查看前面的示例 1) 和 3)。

最后,领域设置中的Client Session IdleClient Session Max 字段可以被客户端本身的Client Session IdleClient Session Max 覆盖,这将特别影响该客户端的refresh token lifespan

同样的逻辑适用,但不是考虑领域设置中的值Client Session IdleClient Session Max,而是需要考虑客户端高级设置中的值。

【讨论】:

不知道说什么。。这个应该是官方文档里的内容 @KubaŠimonovský 是的,我同意那里缺少文档,人们必须花费大量时间“玩弄”这些字段才能了解它 感谢您的详细解答! 这是我见过的最好的不被接受的答案。非常感谢。 很好的答案!谁读了这篇评论,请投票给这个答案。

以上是关于如何在 Keycloak 中指定刷新令牌的生命周期的主要内容,如果未能解决你的问题,请参考以下文章

如何在关联类型中指定生命周期参数?

我啥时候需要在 Rust 中指定显式生命周期?

访问和刷新令牌的生命周期

如何设置访问令牌在几秒钟内过期

刷新后如何使以前的 JWT 令牌无效

如何使用 Spring boot keycloak 适配器 + spring security 强制更新 oAuth 令牌(访问令牌 + 刷新令牌)。?