要从Keycloak v18+正确注销,我需要构造以下URL:
http://localhost:8081/realms/%REALM_NAME%/protocol/openid-connect/logout?post_logout_redirect_uri=%ENCODED_URI%&id_token_hint=%ID_TOKEN_HINT%
我的问题与id_token_hint
有关。我可能从Spring Security OAuth2AuthenticationToken
中提取了一个令牌提示值。现在,我不明白这个令牌的生存期。它有到期日吗?它是否特定于每个浏览器会话?例如,如果同一个用户打开两个不同的浏览器并使用相同的凭据登录,如果该用户从一个浏览器注销,该怎么办?Keycloak会话是否会在第二个浏览器中自动终止?
我之所以询问id_token_hint
,是因为我需要将它存储在服务器上的某个位置,以便为每个用户提供服务,因此我需要了解-存储为每个用户发布的最新id_token_hint
(无论发布的是哪个浏览器和哪个会话)是否合适,还是需要存储所有这些文件并以某种方式区分它们(如何,基于什么)?
1条答案
按热度按时间ig9co6j11#
有有效期吗?
就像访问令牌一样,id令牌也有一个过期时间。每次使用刷新令牌从Keycloak服务器获取新的访问令牌时,也可以请求新的id令牌。
它是否特定于每个浏览器会话?例如,如果同一个用户打开两个不同的浏览器并使用相同的凭据登录,该怎么办?如果该用户从一个浏览器注销,该怎么办?Keycloak会话是否会在第二个浏览器中自动终止?
在Keycloak中,id令牌与用户会话紧密相关,您可以在声明“sid”上看到(* 即 * session id)上出现的前述令牌。如果获得新的id令牌,则在当前用户会话的范围内(例如,使用刷新令牌机制获得新的ID令牌)“sid”将保持相同,然而“jti”的值(* 即,* 此令牌的唯一标识符。)声明将更改。因此,它是新的id令牌,但仅限于同一用户会话。
如果您向令牌端点发出一个全新的请求,而不使用刷新令牌机制(* 例如,* 用户在另一个浏览器上进行身份验证),您将获得一个新的id令牌,该令牌与新创建的会话id相同。
关于根据OpenID Connect RP发起的注销的注销行为:
当id_token_hint参数存在时,OP必须验证其是否为ID令牌的颁发者。当ID令牌的aud声明和/或sid**声明所标识的RP在OP处具有当前会话或最近会话时,OP应接受ID令牌。即使在过期时间已经过去的情况下。**如果ID令牌的sid声明与RP的当前会话或OP处的最近会话不对应,则OP应将注销请求视为可疑,并可拒绝执行。
基于此,我的假设是Keycloak将注销在id令牌中声明'sid'上编码的用户会话。