内容大纲

  1. refresh_token作用
  2. 使用方法
  3. refresh_token规范
  4. keycloak开启refresh_token的限制
  5. refresh_token时的错误汇总
  6. keycloak中refresh_token的底层逻辑

一 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的限制

五 refresh_token时的错误汇总

  • 当refresh_token超过限制时,会返回invalid_grant错误,此时,需要重新登录

  • 再次使用refresh_token,同样返回状态码400,但返回消息体会有变化

  • 如果当前session已经失效,即会话达到了session max的时间,将返回下面错误

  • 如果当前客户端与token客户端不一致,将返回下面错误

  • 如果当前当前端开启了同意许可,将返回下面错误

六 keycloak中refresh_token的底层逻辑

  1. validateToken方法

  2. 通过session_state获取userSession对象,如果userSession对象为空,说明refresh_token已经失效,返回400 Session not active

  3. isSessionValid方法主要验证会话是否有效,主要判断以下几个部分

  • 用户会话是否存在,user-session是否存在
  • 获取session空闲时间和最大时间,它们的逻辑与是否开启记住我有关
  • 会有两层时间的比较,来确定session是否有效
    • 第一层,session空闲时间是否大于(当前时间-最后刷新token时间-容错窗口期(120秒))
    • 第二层,session最大时间是否大于(当前时间-session开始时间)
  • 上面两层同时满足,说明session是有效的

  1. 从userSession中获取当前用户对象
  2. 判断用户是否有效
    • 如果用户被删除,返回400 Unknown user
    • 如果用户状态为禁用,返回400 User disabled
    • 如果用户需要一个必要的行为,返回400 User has required action
  3. 判断当前refresh_token的建立时间是否早于会话开始时间,正常情况下肯定是晚于会话时间,如果早于,返回400 Refresh toked issued before the user session started
  4. 判断当前userSession是否在当前client_id对应的clientSession里,如果没有,返回400 Session doesn't have required client
  5. 判断当前refresh_token里的azp是否与请求参数client_id相同,不同返回400 Unmatching clients
  6. 验证refresh_token是否被篡改
  7. 检查客户端是否有consent的授权许可同意,如果开启了,会返回400 Client no longer has requested consent from user
  8. 成功建立新的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"
}

keycloak~refresh_token的标准化的更多相关文章

  1. keycloak~账号密码认证和授权码认证

    用户名密码登录 POST /auth/realms/demo/protocol/openid-connect/token 请求体 x-www-form-urlencoded grant_type:pa ...

  2. keyclaok~keycloak存到cookie中的值和session_state

    keycloak存到cookie中的值 AUTH_SESSION_ID KEYCLOAK_IDENTITY KEYCLOAK_SESSION AUTH_SESSION_ID 用户的当前session_ ...

  3. Atitit常见的标准化组织与规范数量jcp ecma iso

    Atitit常见的标准化组织与规范数量jcp ecma iso 1. 常见的标准化组织1 1.1. 重要的基金会apache1 1.2. 美国国家标准学会(American NationalStand ...

  4. 【原】关于使用sklearn进行数据预处理 —— 归一化/标准化/正则化

    一.标准化(Z-Score),或者去除均值和方差缩放 公式为:(X-mean)/std  计算时对每个属性/每列分别进行. 将数据按期属性(按列进行)减去其均值,并处以其方差.得到的结果是,对于每个属 ...

  5. 第二章:UNIX标准化及实现

    本章节介绍个UNIX编程环境的标准化的进展,对ISO C,POSIX和Single UNIX Specification三个主要标准进行了说明 本章后面部分介绍了限制的具体实例. 我学习本章的心得是: ...

  6. Atitit USRqc62204 证书管理器标准化规范

    Atitit USRqc62204 证书管理器标准化规范 /atiplat_cms/src/com/attilax/cert/CertSrv4mv.java /** * */ package com. ...

  7. Atitit 发帖机系列(6) USRQBN2201 setup spec安装程序的实现规范与标准化解决方案

    Atitit 发帖机系列(6) USRQBN2201 setup spec安装程序的实现规范与标准化解决方案 安装主要解决一个问题,就是resin的内容启动路径以及端口..这里是使用的端口8077 主 ...

  8. Atitit 发帖机实现(4 )- usbQBM1601 gui操作标准化规范与解决方案attilax总结

    Atitit 发帖机实现(4 )- usbQBM1601 gui操作标准化规范与解决方案attilax总结 1.1. 根据gui的类型使用不同的gui调用api1 1.2. Script化1 1.3. ...

  9. Atitit   发帖机实现(3 )---usrQBN023 js提交ajax内容到后端规范与标准化

    Atitit   发帖机实现(3 )---usrQBN023 js提交ajax内容到后端规范与标准化 大段内容务必要替换转义换行符号1 提交务必使用utf编码,否则解码后的可能缺失,是web serv ...

  10. Atitit usrQBK1600 技术文档的规范标准化解决方案

    Atitit usrQBK1600 技术文档的规范标准化解决方案 1.1. Keyword关键词..展关键词,横向拓展比较,纵向抽象细化拓展知识点1 1.2. 标题必须有高大上词汇,参考文章排行榜,1 ...

随机推荐

  1. Simple FOC内置通信接口学习(一):实时监控电机状态

    本文参(zhao)考(chao)至官方文档https://docs.simplefoc.com/docs_chinese/monitoring 引言 在使用Simple FOC控制电机的过程中,尤其是 ...

  2. R数据分析:PLS结构方程模型介绍,论文报告方法和实际操作

    前面给大家写的关于结构方程模型的文章都是基于变量的方差协方差矩阵来探讨变量间关系的,叫做covariance-based SEM,今天给大家介绍一下另外一个类型的SEM,叫做偏最小二乘结构方差模型.一 ...

  3. Finereport调用python服务进行大数据量导出

    Finereport调用python服务进行大数据量导出 背景: 在使用finereport过程中,我们发现在数据导出这块一直是一个瓶颈,闲来无事,思索一番,想出来一种场景来应对此问题.供各位大佬参考 ...

  4. spring boot 配置多个DispatcherServlet

    传统的web项目,只需要在web.xml里配置多个即可,并且支持多个url-pattern 在spring boot中,我们默认无需配置,系统会自动装配一个,感兴趣的可以看下源码 org.spring ...

  5. Datawhale冬令营第二期!Task2🌼

    Datawhale冬令营第二期-Task2:学AI编程的Prompt工程,提升效果 对应链接:https://www.datawhale.cn/activity/116/23/95?rankingPa ...

  6. 从异常{ 无法将 匿名方法 转换为类型“System.Delegate”,因为它不是委托类型 }说开去

    从异常{ 无法将 匿名方法 转换为类型"System.Delegate",因为它不是委托类型 }说开去. 查看如下代码: this.Invoke(delegate { Messag ...

  7. Windows 配置自动更新重启策略

    I. 打开策略编辑器 [Win + R]打开 "运行" 窗口,输入: gpedit.msc 打开"本地组策略编辑器". II. 设置不自动重启 启用策略,选择在 ...

  8. Raspberry pi 上部署调试.Net的IoT程序

    树莓派(Raspberry pi)是一款基于ARM 架构的单板计算机(Single Board Computer),可以运行各种 Linux 操作系统,其官方推荐使用的 Raspberry Pi OS ...

  9. P1437 敲砖块 题解

    题意 在一个凹槽中放置了 \(n\) 层砖块.最上面的一层有 \(n\) 块砖,从上到下每层依次减少一块砖.每块砖都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示: 14 15 4 3 23 3 ...

  10. 【漏洞分析】20250105-SorraStaking:奖励金额计算错误,每次取款都有大收益

    背景信息 2024-12-21 11:58:11 (UTC) 准备交易:https://app.blocksec.com/explorer/tx/eth/0x72a252277e30ea6a37d2d ...