OIDC & OAuth2.0 认证协议最佳实践系列 02 - 授权码模式接入 Authing
在上一篇文章中,我们整体介绍 OIDC / 协议( 点击下方图片即可查看 ),本次我们将重点围绕授权码模式(Authorization Code)以及接入 Authing 进行介绍,从而让你的系统快速具备接入用户认证的标准体系。
接入 Authing 后的优势:
(资料图)
在整个 Authing 的身份源中,已经包含了社会化登录方式 微信、微博、QQ、FB、TW ...等等,企业登录方式 飞书、钉钉、企微、AD 等等,只要你完成了接入 Authing 就意味着你的业务系统具备了这些能力。
01.授权码模式(Authorization Code)
授权码模式适合应用具备后端服务器的场景。授权码模式要求应用必须能够安全存储密钥,用于后续使用授权码换 access_token。授权码模式需要通过浏览器与终端用户交互完成认证授权,然后通过浏览器重定向将授权码发送到后端服务,之后进行授权码换 token 以及 token 换用户信息。
整体流程
整体上,有以下流程:
1. 在你的应用中,让用户访问登录链接,浏览器跳转到 Authing,用户在 Authing 完成认证。
2. 浏览器接收到一个从 Authing 服务器发来的授权码。
3. 浏览器通过重定向将授权码发送到你的应用后端。
4. 你的应用服务将授权码发送到 Authing 获取 AccessToken 和 IdToken,如果需要,还会返回 refresh token。
5. 你的应用后端现在知道了用户的身份,后续可以保存用户信息,重定向到前端其他页面,使用 AccessToken 调用资源方的其他 API 等等。
流程图如下:
准备接入
在 Authing 创建应用及配置
创建应用:
配置登录回调和登出回调,配置为你实际项目的地址,我们在这里配置 localhost 用于测试。
若你想匹配多个登录/登出回调,可以使用 ‘*’ 号进行通配,登录/登出回调可以是如下格式:
在协议配置中,我们勾选 authorization_code 并且使用 code 作为返回类型,如下图所示:
接入测试
01 所需调用接口列表
GET${host}/oidc/auth 发起登录(拼接你的发起登录地址)
POST${host}/oidc/token 获取 Token
GET${host}/oidc/me 获取用户信息
POST${host}/oidc/token/introspection 校验 Token
POST${host}/oidc/token 刷新 Token
POST${host}/oidc/revocation 吊销 Token
GET${host}/session/end 登出
02 Run in Postman
以下要介绍的接口可以通过我们的在线 postman collection 自行 fork 体验。
03 发起登录
这是基于浏览器的 OIDC 的起点,请求对用户进行身份验证,并会在验证成功后返回授权码到您所指定的 redirect_uri。
拼接发起登录地址(浏览器中打开):
https://{host}/oidc/auth?scope=openid+profile+email+phone+username&redirect_uri={redirect_uri}&response_type=code&client_id={应用 ID}&state={state}
如您需要额外获取 refresh_token 则请求格式为:
https://{host}/oidc/auth?
scope=openid+profile+offline_access+username+email+phone&redirect_uri=http://localhost:8080/&response_type=code&client_id={应用 ID}&prompt=consent&state={state}
点此体验:
/oidc/auth?scope=openid+profile+offline_access+username+email+phone&redirect_uri=http://localhost:8080/&response_type=code&prompt=consent&nonce=054d3c0e-9df9-46f2-a8fa-a7f479032660&client_id=63eb4585156d977101dd3750&state=1676366724
参数说明:
04 获取 Token
用户在 Authing 侧完成登录操作后, Authing 会将生成的 code 作为参数回调到 redirect_uri 地址,此时通过 code 换 token 接口即可拿到对应的访问令牌 access_token 。
1. 请求参数
2. 请求事例
3. 响应示例 (成功)
4. 响应示例 (失败)
05 通过 AccessToken 获取用户信息
此端点是 OIDC 获取用户端点,可以通过 AccessToken 获取有关当前登录用户的信息。
1. 请求参数
2. 请求示例
3. 响应示例 (成功)
4. 响应示例 (失败)
06 校验 Token
此端点接受 access_token、id_token、refresh_token ,并返回一个布尔值,指示它是否处于活动状态。如果令牌处于活动状态,还将返回有关令牌的其他数据。如果 token 无效、过期或被吊销,则认为它处于非活动状态。
1. 验证 Token 分为两种方式:
本地验证与使用 Authing 在线验证。我们建议在本地验证 JWT Token,因为可以节省你的服务器带宽并加快验证速度。你也可以选择将 Token 发送到 Authing 的验证接口由 Authing 进行验证并返回结果,但这样会造成网络延迟,而且在网络拥塞时可能会有慢速请求。
access_token 可以使用 RS256 签名算法或 HS256 签名算法进行签名。下面是这两种签名算法的区别:
RS256 是使用RSA算法的一种数字签名算法,它使用公钥/私钥对来加密和验证信息。RS256 签名生成的令牌比 HS256 签名生成的令牌更加安全,因为使用RSA密钥对进行签名可以提供更高的保护级别。使用RS256签名算法的令牌可以使用公钥进行验证,公钥可以通过 JWK 端点获取。
HS256 是使用对称密钥的一种数字签名算法。它使用同一个密钥进行签名和验证。HS256 签名算法在性能方面比 RS256 签名算法更快,因为它使用的是对称密钥,而不是使用 RSA 公钥/私钥对来签名和验证。使用 HS256签名算法的令牌可以通过 shared secret (应用密钥)进行验证。
在实际应用中,RS256算法更加安全,但同时也更加消耗资源,如果系统需要高性能,可以选择 HS256 签名算法。
以下是本地验证和在线验证的优劣对比:
2. 在线验证
需要注意的是,id_token 目前无法在线校验,因为 id_token 只是一个标识,若需要校验 id_token 则需要您在离线自行校验。
请求参数
请求示例
校验 access_token 响应示例(校验通过)
校验 access_token 响应示例(校验未通过)
校验 refresh_token 响应示例 (校验通过)
校验 refresh_token 响应示例(校验未通过)
3. 离线校验
可参考文档:离线校验
文档链接:/v2/guides/faqs/#
我们简单说下,若您使用离线校验应该对 token 进行如下规则的校验:
1. 格式校验 - 校验 token 格式是否是 JWT 格式
2. 类型校验 - 校验 token 是否是目标 token 类型,比如 access_token 、id_token、refresh_token
3. issuer 校验 - 校验 token 是否为信赖的 issuer 颁发
4. 签名校验 - 校验 token 签名是否由 issuer 签发,防止伪造
5. 时间校验 - 校验 token 是否在有效期内
6. claims 校验 - 是否符合与预期的一致
以上 6 点均校验通过,我们才能认为 token 是有效且合法的。
下面是一个示例 Java 代码,可以用于在本地校验 OIDC RS256 和 HS256 签发的 access_token 。
这段代码使用 Nimbus JOSE+JWT 库来解析和验证 JWT token。它使用指定的 issuer 和 audience 值对access_token 进行验证,并验证 JWT 中 claims 的格式、类型、签名、有效期和 issuer。如果发生任何验证错误,则将抛出 RuntimeException。使用时需要传入对应的 JWK URL 和 access_token 进行调用,例如:
这个示例只校验了RS256和HS256签名算法。
07 刷新 Token
此功能用于用户 token 的刷新操作,在 token 获取阶段需要先获取到 refresh_token 。
1. 请求参数
2. 请求示例
3. 响应示例(成功)
4. 响应示例(失败)
08 撤回 Token
撤销 access_token / refresh_token
1. 请求参数
2. 请求示例
3. 响应示例(成功)
4. 响应示例(失败)
09 用户登出
使用此操作通过删除用户的浏览器会话来注销用户。
post_logout_redirect_uri 可以指定在执行注销后重定向的地址。否则,浏览器将重定向到默认页面
1. 请求参数
2. 请求示例 (浏览器访问)
02.SSO (Single Sign-On) 单点登录 & SLO (Single Logout) 单点登出
SSO 实现
SSO(Single Sign-On) 单点登录,即同时访问多个应用仅需要登录一次。
举例:我们现在有两个站点分别是
我们希望用户在 进行认证后,跳转到 ething 后无需二次认证,反之也是一样的。
具体流程:
1. 用户访问 ,uthing 前端发现用户未认证,跳转至 Authing 进行认证。
2. 用户在 Authing 发起认证完成,Authing 创建 SSO Session ,下发临时授权码 (code) 重定向到 uthing 后台。
需要注意的是,在这里我们也可以重定向到前端页面,再由前端页面自行判断如果是 Authing 回调请求,则携带临时 code 到 uthing 后台去获取 token 。
3. uthing 后台通过 code 向 Authing 换取 access_token、id_token、refresh_token 等,并下发给前端。
4. uthing 前端通过 access_token 可以直接向 Authing OIDC 用户信息端点获取当前用户信息。
5. uthing 前端在在后续请求后台时,携带由 Authing 颁发的 access_token ,后台在接受到用户请求后去 Authing 校验 Token 是否有效,有效则可放行,若 Token 校验失败或已过期则返回错误信息。
6. 用户访问 ,ething 跳转至 Authing 进行认证。
7. 由于用户在 Authing 已经完成认证,创建了 sso_session ,Authing 侧直接下发临时授权码 (code) ,无需二次认证,后续流程同 1 。
我们发现,用户在 uthing 认证成功的时候,再访问 ething 的时候会向 Authing 跳转一下,才能完成后续流程,这是由于 和 并不是同一个站点,无法实现 cookie 共享,如果你的产品地址是 :
我们则可以利用相同域下 cookie 共享的方式实现 SSO ,从而避免此问题。
SLO 实现
SLO(Single Logout) 单点登出,即多个应用仅需要登出一次,其他应用也自动登出 。
01 场景 1
如果你的产品地址是同一个域,例如:
则 SLO 流程如下:
1. 用户在某个站点登出,我们则需要调用 OIDC 登出端点销毁 Token,由于是 cookie 共享实现的 SSO ,然后清除 对应会话的 cookie 即可。
2. ething / uting 应当在每次发起请求前,判断 cookie 中是否存在登录态,若不存在,则需要跳转默认页面提示用户已经登出。
02 场景 2
如果你的产品地址不是同一个域,例如:
则 SLO 流程如下:
1. 用户在某个站点登出,我们则需要调用 OIDC 登出端点销毁 Token,在 Authing 的应用配置中,你应当先把应用都添加到 SSO 中,或者 和 使用 Authing 的同一个自建应用,当用户在某个站点登出后,另外一个站点的 Token 也会失效。
2. 用户未登出的站点发起请求,当后台校验 Token 失败后,则下发清除 cookie 的命令并跳转默认页面提示用户已经登出,需要登录。
03.本章总结
本章我们介绍了 OIDC 授权码模式的接入流程以及相关接口的调用方式,对于小白来说可能需要整体跑一遍流程才能熟悉,我们也建议你 fork 我们的 postman collection 跑一遍流程,对授权码模式你就基本掌握啦。
接下来我们还会介绍 OIDC 的授权码+PKCE 流程,以及接入 Authing 的方式,需要你对授权码模式的流程有一定了解哦。
标签:
推荐文章
- 研究人员最新发现 单个细胞可同时处理成百上千个信号
- 陆军第73集团军某旅 创新升级模拟训练器材
- 长期暴露在光照下性能退化 科学家发现钙钛矿太阳能电池最大缺陷
- 宁夏启动双百科技支撑行动 构建高水平产业创新体系
- 陆军炮兵防空兵学院 毕业学员综合战术演习现地备课工作圆满完成
- 国内首颗以茶叶冠名遥感卫星 安溪铁观音一号发射成功
- 区域特色产业转型升级 四川屏山以“3+”模式推进科技创新工作
- 激发创新动能促进产业发展 无锡滨湖走出产业转型“绿色”路
- 绥化全域低风险!黑龙江绥化北林区一地调整为低风险
- 走访抗美援朝纪念馆:长津湖的寒冷,与战斗一样残酷
- 节后第一天北京白天晴或多云利于出行 夜间起秋雨或再上线
- 走近网瘾少年们:他们沉迷网络的病根何在?
- “双减”后首个长假:亲子游、研学游需求集中释放
- 获2021年诺奖的蛋白,结构由中国学者率先解析
- 他从一窍不通的“门外汉”,到重装空投“兵专家”
- 升旗、巡岛、护航标、写日志,他们一生守护一座岛
- 中国故事丨“沉浸式”盘点今年的教育好声音!
- 农业农村部:确保秋粮丰收到手、明年夏季粮油播种
- “双减”出台两个月,组合拳如何直击减负难点?
- 《山海情》里“凌教授”的巨菌草丰收啦
- 且看新疆展新颜
- 天山脚下,触摸丝路发展新脉动
- 160万骑手疑似“被个体户”?平台不能当甩手掌柜
- 网游新政下,未成年人防沉迷的“主战场”在哪?
- “辱华车贴”商家及客服被行拘,处罚要不放过每一环
- 沙害是自然界的恶魔,而他是荒沙碱滩的征服者
- 面对婚姻,“互联网世代”的年轻人在忧虑什么?
- IP类城市缘何吸引力强?玩法创新带动游客年轻化
- 国庆主题花坛持续展摆至重阳节
- 都市小资还是潮流乐享?花草茶市场呈爆发性增长
- 从1.3万元降到700元,起诉书揭秘心脏支架“玄机”
- 北京国庆7天接待游客超861万人次 冬奥线路受青睐
- 陈毅元帅长子忆父亲叮嘱:你们自己学习要好,就可以做很多事儿
- 报告显示:这个国庆假期,粤川浙桂赣旅游热度最高
- 中国科技人才大数据:广东总量第一,“北上”这类人才多
- 嘉陵江出现有记录以来最强秋汛
- 全国模范法官周淑琴:为乡村群众点燃法治明灯
- 线上教学模式被盯上,网络付费刷课形成灰色产业链
- 云南保山:170公里边境线,4000余人日夜值守
- 警方查处故宫周边各类违法人员12人
- 农业农村部:确保秋粮丰收到手、明年夏季粮油播种
- 受南海热带低压影响 海南海口三港预计停运将持续到10日白天
- 多地网友投诉遭遇旅游消费骗局,呼吁有关部门严查乱象
- 神经科学“罗塞塔石碑”来了:迄今为止最完整的大脑细胞图谱
- 汾河新绛段发生决口
- 陕西支援14省份采暖季保供用煤3900万吨
- 这场红色故事“云比拼”,穿越时空为我们指引方向
- 受琼州海峡封航影响 10月7日、8日进出海南岛旅客列车停运
- 辽宁省工信厅发布10月8日电力缺口橙色预警
- 广州10月8日至20日对所有从省外来(返)穗人员实施核酸检测
- 假期怎么过得这么快?国庆5.15亿人次出游,你咋过的?
- 国庆假期全国道路交通总体安全平稳有序
- 哈尔滨市南岗区爱达88小区将调整为低风险地区
- 新疆霍尔果斯市2例无症状感染者新冠病毒均为德尔塔变异株
- 百闻不如一见——北京大学留学生参访新疆
- 看,生机勃勃的中国
- 国庆假期中国预计发送旅客4.03亿人次
- 新疆兵团可克达拉市:195名密接者已全部隔离医学观察
- 山西平遥消防4天29次救援:拖着腿走路也要完成任务
- 国庆假期北京接待游客861.1万人次
- 冷空气自西向东影响中国大部地区 气温将下降4℃至6℃
- 新疆哈密市巴里坤县发生4.3级地震 震源深度9千米
- 国庆假期中国国内旅游出游5.15亿人次
- 公安部交管局:国庆假期日均出动警力18万余人次,5位交警辅警牺牲
- 受南海热带低压影响广东将暂别高温天气
- “数说”杭州无障碍改造:触摸城市“爱的厚度”
- 新疆霍尔果斯无症状感染者新冠病毒属德尔塔变异株 未发现高度同源的基因组序列
- 新疆伊犁州:妥善做好滞留旅客安置返回工作
- 国庆假期广西累计接待游客逾3611万人次 实现旅游消费272.41亿元
- 2021年MAGIC3上海市青少年三对三超级篮球赛落幕
- 新疆兵团第四师可克达拉市1名无症状感染者为餐饮从业人员
- 哥伦比亚遇上广州:洋茶人“云上”喫茶 传播中国茶“味道”
- 厦门同安区四区域调整为低风险 全市无中高风险地区
- 直径2米“面气球”亮相 山西首届“寿阳味道”美食大赛启幕
- 世界第一埋深高速公路隧道大峡谷隧道出口端斜井掘进完成
- 浙南沿海村村发展有妙招 搭乘共富快车打造“海上花园”
- 新疆霍尔果斯两例无症状感染者新冠病毒均属德尔塔变异株
- 南沙港铁路国庆假期不停工 力争今年年底开通
- 添加陌生人为好友 内蒙古两女子被骗126万
- 中国国庆假期出行热:数字改变“关键小事”
- 水能载物亦能“生金” 浙江遂昌山村以水为媒奔共富
- 铁路人国庆雨中巡查排险记:一身雨衣、一把铁锹保安全畅通
- 铁路迎返程高峰 西安局集团公司加开79趟高铁列车
- 受热带低压影响 琼州海峡北岸等待过海车辆排长龙
- 哈尔滨市学校有序恢复线下教学
- 哈尔滨一地风险等级调整为低风险
- 从进“培训班”到看《长津湖》
- 安徽黄山国庆假期迎客12万余人 旅游市场稳步复苏
- 山西解除持续近90小时的暴雨四级应急响应
- 科学拦峰错峰削峰 嘉陵江洪水过境重庆中心城区“有惊无险”
- 粤高速大湾区路段假期车流集中 跨珠江口通道尤甚
- 千年街区“非遗”风催热国庆假期本地游
- “颜值担当”里的中国,映照“万物和谐”新气象
- 杭州“十一”假期后初中取消统一早读
X 关闭
资讯
X 关闭
行业动态
-
OIDC & OAuth2.0 认证协议最佳实践系列 02 - 授权码模式接入 Authing
- OIDC & OAuth2.0 认证协议最佳实践系列 02 - 授权码模式接入 Authing
- 彩虹股份:7月7日融资买入5969.96万元,融资融券余额3.98亿元
- 保险行业:基本面改善有望延续,板块估值修复将成为中期主题
- 出动吧,智能机器人!来看看“玉琮馆”里的科技范
- 榜妹热线 | 肖战告别古偶剧?王楚然恋爱高手?侯明昊自己接戏?陈星旭资源?姜贞羽新剧?
- everybody歌名(求DJ曲everybodypeople的歌词)
- 付忠伟被逮捕!被查前多名搭档、下属已落马……
- 精锻科技获8家机构调研:公司今年业务预期燃油车业务占比65%左右,新能源车业务占比35%左右(附调研问答)
- 利淡消息拖累大市 港股三大指数集体回落
- 亚投行公布内部调查结果:没有任何证据表明,亚投行董事会或管理层的决策受到不当影响


