内容大纲

  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. AD使用插件生成交互式BOM

    AD使用插件生成交互式BOM 效果图镇楼: 下面来说一下怎么搞,过程其实也很简单,就加载一个脚本的事儿. 1.下载AD用交互式BOM插件 首先前往GitHub下载这位大佬开发的插件 地址:https: ...

  2. Flutter ListView顶部空白去除

    Flutter ListView顶部空白去除 当listview没有和AppBar一起使用时,顶部会有一个自动的空白部分,可以用MediaQuery.removePadding去掉 return Me ...

  3. 用 16G 内存存放 30亿数据(Java Map)转载

    在讨论怎么去重,提出用 direct buffer 建 btree,想到应该有现成方案,于是找到一个好东西: MapDB - MapDB : http://www.mapdb.org/ 以下来自:ko ...

  4. StreamJsonRpc.ConnectionLostException 在请求完成之前, 与远程方的 JSON-RPC 连接已丢失

    今天电脑重启之后,发现 visual studio 2022 的智能提示与报错经常性不好用,不光不能在正常时候提示代码错误信息,甚至在编译过后也不提示错误.反复重启,刚开始正常,隔一会儿就会提示什么什 ...

  5. CentOS 7 安装教程(步骤齐全)

    第一步:选择Install CentOS7来进行安装 第二步:选择安装语言,建议选择English,然后点击继续 第三步:依次进行 [软件选择]和[分区操作] 3.1.软件安装选择,刚开始建议选择GN ...

  6. 【单片机】初次实验:Keil51的使用

    哔哩哔哩/CSDN/博客园:萌狼蓝天 延时器 delay(int count){ int i,j; for(i=0;i<count;i++){ for(j=0;j<1000;j++); } ...

  7. 黑苹果(Hackintosh) - 问题,修改CPU数量和内存数量后,系统重启失败

    1. 问题复现 安装完黑苹果后,内存默认的 1个处理器2个核心.2G内存,发现不够用. 于是,修改了 VMware 对此系统的 硬件配置 内存: 2G -> 8G 处理器:1个处理器 -> ...

  8. hibernate错误org.hibernate.AnnotationException: No identifier specified for entity:

    实体类继承BaseEntity时报错.解决方法:在属性或者get方法上加@Id@Id@GeneratedValue(strategy=GenerationType.AUTO)@Column(uniqu ...

  9. Qt编写项目作品35-数据库综合应用组件

    一.功能特点 同时支持多种数据库比如odbc.sqlite.mysql.postgresql.sqlserver.oracle.人大金仓等. 一个数据库类即可管理本地数据库通信,也支持远程数据库通信等 ...

  10. Web网页端IM产品RainbowChat-Web的v7.2版已发布

    一.关于RainbowChat-Web RainbowChat-Web是一套Web网页端IM系统,是RainbowChat的姊妹系统(RainbowChat是一套基于开源IM聊天框架 MobileIM ...