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

89

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

"refresh_expires_in": 1800

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

输入图像描述

4个回答

177

正如@Kuba Šimonovský在评论中指出的,被接受的答案缺少其他重要因素:

实际上,情况要复杂得多。

TL;DR 可以推断出刷新令牌生命周期将等于 (SSO会话空闲时间客户端会话空闲时间SSO会话最大时间客户端会话最大时间) 中最小的值。


在花费一些时间研究后,现在回顾这个线程,我觉得之前的回答没有详细解释发生了什么(甚至有人可能会认为它们实际上是错误的)。

现在我们暂时只考虑SSO会话空闲时间SSO会话最大时间

  • 如果SSO会话最大时间>SSO会话空闲时间,此时刷新令牌生命周期SSO会话空闲时间相同。为什么?因为如果应用程序空闲了SSO会话空闲时间,则用户会注销并且刷新令牌绑定到该值。每当应用程序请求新令牌时,刷新令牌生命周期SSO会话空闲时间的倒计时值都将被重置;
  • 如果 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 小时和:

  1. Client Session Idle = 600 秒和 Client Session Max = 1 小时。在这种情况下,refresh token lifetimeClient Session Idle 相同;
  2. Client Session Idle = 600秒,Client Session Max = 60秒。在这种情况下,refresh token lifespanClient Session Max相同。
  3. Client Session Idle = 1天,Client Session Max = 10天。在这种情况下,refresh token lifespanSSO Session Idle相同;
  4. 因此,简而言之,您可以推断出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值,而不是来自领域设置的值。

提示:第三点应该以“…与客户端会话空闲时间相同;”结尾,因为我理解你的逻辑:它是客户端会话空闲时间与最大值之间最短的。 - Arno Teigseth
@ArnoTeigseth 不,实际上它将是SSO会话空闲、客户端会话空闲、SSO会话最大值和客户端会话最大值中最小的一个。 - dreamcrash
1
啊,好的,我以为你只是在比较点3内部的两个值。但现在我明白了,所有的三个点都是与顶部文本进行比较的情况。非常好的答案!目前正在研究Keycloak设置客户端会话空闲时间时出现的一个问题,似乎是一个错误。 - Arno Teigseth

53

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


39
实际上,这要复杂得多。每个领域之间存在许多关系,您可以在3个不同的位置上覆盖它…为了明确起见,Keycloak非常复杂。但对我来说,我必须将“客户端会话空闲”设置为0,“客户端会话最大值”设置为0,“SSO会话空闲”设置为999天。之后,我可以使用“访问令牌寿命”控制访问令牌超时,使用“SSO会话最大值”控制刷新令牌超时。我花了1个小时玩弄所有变量。 将采用“SSO会话空闲”或“访问令牌寿命”,以较短的时间为准。 - Kuba Šimonovský
@KubaŠimonovský,将SSO会话空闲时间设置为999的问题是,您基本上失去了空闲功能。 - dreamcrash
@KubaŠimonovský 我将 客户端会话空闲时间 设置为0,客户端会话最大时间 设置为0,SSO会话空闲时间 设置为12小时,但是空闲会话仅在30分钟后过期。还需要什么? - Shashank Shekher
谢谢,@KubaŠimonovský 这很有帮助。 - Jalaj Chawla
在最新版本(写作时为15.0.2)中,refresh_expires_in值一直保持为0。为了解决这个问题,我不得不将“离线会话最大限制”切换到“开启”状态。 - Marty

5
在v11.0.3版本中,客户端的高级设置中没有SSO Session Idle设置(不确定这些是否已被重命名、移动或在管理界面的其他地方可用作域设置),因此从默认客户端设置开始,您可以指定Client Session Max以控制刷新令牌的生存期,而无需更改其他持续时间设置(访问令牌生命周期仍按预期进行)。证据:调整设置并检查响应中的refresh_expires。

1
刷新令牌的生命周期由“Realm设置”中“Tokens”选项卡中的“Client Session Max”参数定义。
它还可以在客户端设置页面的“高级设置”菜单下覆盖。
如Keycloak文档所述:https://www.keycloak.org/docs/latest/server_admin/#_timeouts

客户端会话最大值

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接