在上一篇文章OIDC & OAuth2.0 认证协议最佳实践系列 02 - 授权码模式(Authorization Code)接入 Authing中,我们整体介绍 OIDC / OAuth2.0 协议,本次我们将重点围绕授权码模式(Authorization Code)以及接入 Authing 进行介绍,从而让你的系统快速具备接入用户认证的标准体系。
接入 Authing 后的优势: 在整个 Authing 的身份源中,已经包含了社会化登录方式 微信、微博、QQ、FB、TW ...等等,企业登录方式 飞书、钉钉、企微、AD 等等,只要你完成了接入 Authing 就意味着你的业务系统具备了这些能力。
01 授权码模式(Authorization Code)
1.1 整体流程
整体上,有以下流程:
-
在你的应用中,让用户访问登录链接,浏览器跳转到 Authing,用户在 Authing 完成认证。
-
浏览器接收到一个从 Authing 服务器发来的授权码。
-
浏览器通过重定向将授权码发送到你的应用后端。
-
你的应用服务将授权码发送到 Authing 获取 AccessToken 和 IdToken,如果需要,还会返回 refresh token。
-
你的应用后端现在知道了用户的身份,后续可以保存用户信息,重定向到前端其他页面,使用 AccessToken 调用资源方的其他 API 等等。
流程图如下:
1.2 准备接入
-
在 Authing 创建应用及配置
创建应用:
配置登录回调和登出回调,配置为你实际项目的地址,我们在这里配置 localhost 用于测试。
若你想匹配多个登录/登出回调,可以使用 ‘*’ 号进行通配,登录/登出回调可以是如下格式:
在协议配置中,我们勾选 authorization_code 并且使用 code 作为返回类型,如下图所示:
1.3 接入测试
-
01 所需调用接口列表
GET${host}/oidc/auth 发起登录(拼接你的发起登录地址)
POST${host}/oidc/token 获取 Token
GET${host}/session/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 发起登录
GET${host}/oidc/auth
这是基于浏览器的 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}
点此体验: https://oidc-authorization-code.authing.cn/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
POST${host}/oidc/token
用户在 Authing 侧完成登录操作后, Authing 会将生成的 code 作为参数回调到 redirect_uri 地址,此时通过 code 换 token 接口即可拿到对应的访问令牌 access_token 。
请求参数
请求事例
curl --location --request POST 'https://{host}/oidc/token