篮之新喜 发表于 4 天前

keycloak~refresh_token的标准化

内容大纲

[*]keycloak关于会话有效期的配置
[*]refresh_token作用
[*]使用方法
[*]refresh_token规范
[*]keycloak开启refresh_token的限制
[*]refresh_token时的错误汇总
[*]keycloak中refresh_token的底层逻辑
一 keycloak关于会话有效期的配置

1. 配置 Access Token Lifespan


[*]作用: 控制access_token的有效期。
[*]配置值: 5分钟
[*]操纵:
[*]进入Keycloak管理控制台。
[*]选择你的Realm。
[*]进入Realm Settings > Tokens。
[*]将Access Token Lifespan设置为5分钟。

2. 配置 Refresh Token Lifespan


[*]作用: 控制refresh_token的有效期。refresh_token用于在access_token过期后获取新的access_token。
[*]配置值: 7天
[*]操纵:
[*]进入Realm Settings > Tokens。
[*]将Refresh Token Lifespan设置为7天(604800秒)。

3. 配置 SSO Session Idle


[*]作用: 控制用户会话的空闲时间。如果用户在7天内没有任何操纵,会话将过期,用户必要重新登录。
[*]配置值: 7天
[*]操纵:
[*]进入Realm Settings > Tokens。
[*]将SSO Session Idle设置为7天(604800秒)。

4. 配置 SSO Session Max


[*]作用: 控制用户会话的最大连续时间。设置为一个非常大的值(如1年),以确保用户在7天内操纵过就可以保持登录状态。
[*]配置值: 1年(31536000秒)
[*]操纵:
[*]进入Realm Settings > Tokens。
[*]将SSO Session Max设置为31536000秒(1年)。

5. 配置 Client Session Idle 和 Client Session Max


[*]作用: 控制客户端会话的空闲时间和最大连续时间。发起与SSO会话配置保持一致。
[*]配置值:

[*]Client Session Idle: 7天(604800秒)
[*]Client Session Max: 1年(31536000秒)

[*]操纵:
[*]进入Realm Settings > Tokens。
[*]将Client Session Idle设置为604800秒。
[*]将Client Session Max设置为31536000秒。

6. 配置 Offline Session Idle 和 Offline Session Max


[*]作用: 控制离线会话的空闲时间和最大连续时间。如果你不必要离线会话功能,可以忽略此配置。
[*]配置值:

[*]Offline Session Idle: 7天(604800秒)
[*]Offline Session Max: 1年(31536000秒)

[*]操纵:
[*]进入Realm Settings > Tokens。
[*]将Offline Session Idle设置为604800秒。
[*]将Offline Session Max设置为31536000秒。

7. 配置 Remember Me 功能(可选)


[*]作用: 如果希望用户在关闭浏览器后仍能保持登录状态,可以启用“记着我”功能。
[*]配置值:

[*]SSO Session Idle Remember Me: 7天(604800秒)
[*]SSO Session Max Remember Me: 1年(31536000秒)

[*]操纵:
[*]进入Realm Settings > Tokens。
[*]将SSO Session Idle Remember Me设置为604800秒。
[*]将SSO Session Max Remember Me设置为31536000秒。

二 refresh_token作用

refresh_token是用来刷新access_token的,当access_token过期后,可以通过refresh_token来获取新的access_token,而不必要重新登录。
三 使用方法

curl --location --request POST 'https://{keycloak}/auth/realms/{realm}/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=refresh_token' \
--data-urlencode 'refresh_token={refresh_token}' \
--data-urlencode 'client_id={client_id}' \
--data-urlencode 'client_secret={client_secret}'四 refresh_token规范


[*]每个refresh_token只能使用一次,不可重复使用,KC这边也会进行回收它
[*]通过refresh_token获取新的token时,返回值里会带有新的refresh_token,我们应该使用新的refresh_token来覆盖上一次的refresh_token
[*]refresh_token有效期取决于keycloaktokenssso session idle的值,即会话空闲时间,如果refresh_token在这个时间内没有使用,那么它会失效
[*]refresh_token失效后,当前会话session_state也即失效,此时,必要重新登录
注意:sso session max表示会话最大有效期,在这个时间范围内,用户不必要重新登录,sso session idle表示空间时间,在这个时间内用户不进行操纵,也示为退出,用户必要重新登录,这两个值必须大于0;单位为分,小时,天,不支持永世有效期。
五 keycloak开启refresh_token的限制

https://img2024.cnblogs.com/blog/118538/202502/118538-20250225142930947-1969867623.png
六 refresh_token时的错误汇总


[*]当refresh_token凌驾限制时,会返回invalid_grant错误,此时,必要重新登录
https://img2024.cnblogs.com/blog/118538/202502/118538-20250225142825999-2128311384.png
[*]再次使用refresh_token,同样返回状态码400,但返回消息领会有变革
https://img2024.cnblogs.com/blog/118538/202502/118538-20250225142943597-1584897669.png
[*]如果当前session已经失效,即会话达到了session max的时间,将返回下面错误
https://img2024.cnblogs.com/blog/118538/202502/118538-20250225143006849-736393783.png
[*]如果当前客户端与token客户端不一致,将返回下面错误
https://img2024.cnblogs.com/blog/118538/202502/118538-20250225143031802-2049687941.png
[*]如果当前当前端开启了同意许可,将返回下面错误
https://img2024.cnblogs.com/blog/118538/202502/118538-20250225143043112-822731793.png
七 keycloak中refresh_token的底层逻辑


[*]validateToken方法
https://img2024.cnblogs.com/blog/118538/202502/118538-20250225143107197-1498684481.png
[*]通过session_state获取userSession对象,如果userSession对象为空,说明refresh_token已经失效,返回400 Session not active
https://img2024.cnblogs.com/blog/118538/202502/118538-20250225143118453-1409736499.png
[*]isSessionValid方法主要验证会话是否有效,主要判断以下几个部分


[*]用户会话是否存在,user-session是否存在
[*]获取session空闲时间和最大时间,它们的逻辑与是否开启记着我有关
[*]会有两层时间的比力,来确定session是否有效

[*]第一层,session空闲时间是否大于(当前时间-最后刷新token时间-容错窗口期(120秒))
[*]第二层,session最大时间是否大于(当前时间-session开始时间)

[*]上面两层同时满足,说明session是有效的
https://img2024.cnblogs.com/blog/118538/202502/118538-20250225143134744-1871602317.png

[*]从userSession中获取当前用户对象
[*]判断用户是否有效

[*]如果用户被删除,返回400 Unknown user
[*]如果用户状态为禁用,返回400 User disabled
[*]如果用户必要一个须要的行为,返回400 User has required action

[*]判断当前refresh_token的建立时间是否早于会话开始时间,正常环境下肯定是晚于会话时间,如果早于,返回400 Refresh toked issued before the user session started
[*]判断当前userSession是否在当前client_id对应的clientSession里,如果没有,返回400 Session doesn't have required client
[*]判断当前refresh_token里的azp是否与请求参数client_id相同,不同返回400 Unmatching clients
[*]验证refresh_token是否被窜改
[*]检查客户端是否有consent的授权许可同意,如果开启了,会返回400 Client no longer has requested consent from user
[*]成功建立新的token对象,整个刷新token流程结束
{
    "access_token": "",
    "expires_in": 120,
    "refresh_expires_in": 300,
    "refresh_token": "",
    "token_type": "Bearer",
    "id_token": "",
    "not-before-policy": 1740449130,
    "session_state": "424b8022-600d-421e-a45d-e0315d1a524d",
    "scope": "openid roles email profile"
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: keycloak~refresh_token的标准化