授权码模式(PKCE)
用户访问第三方应用时,第三方应用使用code_challenge
向TOPIAM发起授权登录请求,用户输入用户密码认证成功后,TOPIAM将重定向到第三方应用,并且带上授权码code参数。
获取授权码
请求说明
请求方式:GET
请求地址:https://{your_domain}/api/v1/authorize/{app_code}/oauth2/auth
请求头
无
请求示例
GET https://{your_domain}/api/v1/authorize/{app_code}/oauth2/auth?client_id=2bae87d88feb129f817a1ce52d798e0b&response_type=code&redirect_uri=https://127.0.0.1:8080/login/oauth2&scope=openid profile&code_challenge=e48gxaK8KzZMKHszOHD7ws3jYy7K8rhQuKKSNEn3f8Q&code_challenge_method=S256
请求参数
参数名 | 中文名称 | 必须 | 示例值 | 描述 |
---|---|---|---|---|
client_id | 客户端ID | 是 | 2bae87d88feb129f817a1ce52d798e0b | 申请接入后分配给第三方应用的clientid。 |
response_type | 授权类型 | 是 | code | 此值固定为 code,代表采用授权码模式。 |
redirect_uri | 回 调地址 | 是 | https://127.0.0.1:8080/login/oauth2 | 授权后的回调地址,必须是注册应用时填写的可信域名一致,需要将url进行URLEncode编码。 |
state | state | 可选 | 4dR2J42l--8jkiS2jN9mHTkrl9XXDcECa7GyscM42EY= | 用于防止CSRF攻击,成功授权后回调时会原样带回,请检查用户与state状态绑定。 |
scope | scope范围 | 可选 | openid profile | 可选值openid email phone profile。 |
code_challenge | PKCE挑战码 | 是 | wz-T_qpPke3k7cs1qfgxSToF_kRhpv8RWVj7LpO3xHI | 应用随机生成一串长度43-128的字符并作URL-Safe的Base64编码处理,结果用作 code_verifier,将这串字符通过SHA256哈希,并用URL-Safe的Base64编码处理,结果用作 code_challenge。 |
code_challenge_method | PKCE挑战码加密方法 | 是 | S256 | 固定值S256。 |
响应参数
如果用户成功登录并授权,则会跳转到指定的回调地址,并在redirect_uri
地址后带上授权码code
和原始的state
值。
参数名 | 中文名称 | 必须 | 示例值 | 描述 |
---|---|---|---|---|
code | 授权码 | 是 | JH20mMwZTxL68RvriBqAXctKh3ISauj | 用户登录并授权后,授权服务器返回给应用的授权码。注意:此code有效期5分钟,有效期内只能使用一次。 |
state | 应用端状态码 | 可选 | bnEyPsdFpO7oeYU4zfQD5NGC91klVgWfB | 应用端的状态值。用于第三方应用防止CSRF攻击,成功授权后回调时会原样带回。 |
响应示例
成功
HTTP Status: 302
{redirect_uri}?code=II2MdiC7Vyq5Qkf_M7SVFh3laW0aXREPZIQAtBCfkZ1Sa8D42g9f87-1Rm1tAewapYWzzV-sM__NQj610KOTImaEba15s34sxDfd0FAAVXxmm1vDsDcVIkbTlHi_97Ye
client_id 参数缺失
client_id 参数不正确
response_type 参数值错误
redirect_uri 参数不正确
scope 参数不正确
HTTP Status: 302
{redirect_uri}?error=invalid_scope&error_description=OAuth 2.0 Parameter: scope&error_uri=https://topiam.cn/docs/application/oidc/faq/#错误码
code_challenge 参数不正确
HTTP Status: 302
{redirect_uri}?error=invalid_request&error_description=OAuth 2.0 Parameter: code_challenge&error_uri=https://topiam.cn/docs/application/oidc/faq/#错误码
code_challenge_method 参数不正确
HTTP Status: 302
{redirect_uri}?error=invalid_request&error_description=OAuth 2.0 Parameter: code_challenge_method&error_uri=https://topiam.cn/docs/application/oidc/faq/#错误码
获取token
请求说明
请求方式:POST
请求地址:https://{your_domain}/api/v1/authorize/{app_code}/oauth2/token
请求头
参数名 | 中文名称 | 必须 | 示例值 | 描述 |
---|---|---|---|---|
Content-Type | 数据类型 | 是 | application/x-www-form-urlencoded | 使用表单方式提交参数。 |
危险
注意:此处不需要传递 Authorization Basic 认证信息。
请求示例
POST https://{your_domain}/api/v1/oauth2/token
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=stRWlW&redirect_uri=https://127.0.0.1:8080/login/oauth2&scope=openid profile
请求参数
参数名 | 中文名称 | 必须 | 示例值 | 描述 |
---|---|---|---|---|
grant_type | 授权类型 | 是 | authorization_code | 此值固定为authorization_code。 |
code | 授权码 | 是 | code | 上一步返回的授权code。 |
code_verifier | PKCE验证码 | 是 | aqHAm7JQXUWbjjEJ0DfW | 应用随机生成一串长度43-128的字符并作URL-Safe的Base64编码处理,结果用作 code_verifier,将这串字符通过SHA256哈希,并用URL-Safe的Base64 编码处理,结果用作 code_challenge。 |
redirect_uri | 回调地址 | 是 | https://127.0.0.1:8080/login/oauth2 | 与上面一步中传入的 redirect_uri 保持一致。 |
响应参数
参数名 | 中文名称 | 必须 | 示例值 | 描述 |
---|---|---|---|---|
access_token | 授权令牌 | 是 | 5Vy9tHWsp6xORfDaTVJ49_qtFZ6wXSy | 授权服务器返回给第三方应用的授权令牌。 |
expires_in | 授权令牌的有效期 | 是 | 21599 | 授权服务器返回给应用的访问票据的有效期。注意:有效期以秒为单位。 |
refresh_token | 刷新令牌 | 是 | Su9TAyeB2igIjQD07s81BeycRQ0dppyHuc | 授权服务器返回给第三方应用的刷新令牌。 |
token_type | 令牌类型 | 是 | Bearer | 始终为 Bearer。 |
scope | 授权范围 | 是 | openid profile | |
id_token | 用户令牌 | 是 | eyJraWQiOiIxMTISlh...H2UOrwiXF9CUKm1Zbe-j1 |
响应示例
成功
{
"access_token": "5Vy9tHWsp6xORfDaTVJ49_qtFZ6wXSy",
"refresh_token": "Su9TAyeB2igIjQD07s81BeycRQ0dppyHuc",
"scope": "openid profile",
"id_token": "eyJraWQiOiIxMTISlh...H2UOrwiXF9CUKm1Zbe-j1",
"token_type": "Bearer",
"expires_in": 21599
}
客户端未认证
{
"error_description": "Full authentication is required to access this resource",
"error": "access_denied",
"error_uri": "https://topiam.cn/docs/application/oidc/faq/#错误码"
}
grant_type 错误
{
"error_description": "OAuth 2.0 Parameter: grant_type",
"error": "unsupported_grant_type",
"error_uri": "https://topiam.cn/docs/application/oidc/faq/#错误码"
}
redirect_uri 地址错误
{
"error_description": "The redirect_uri does not match the redirection URI used in the authorization request.",
"error": "invalid_grant",
"error_uri": "https://topiam.cn/docs/application/oidc/faq/#错误码"
}
授权 code 错误
{
"error_description": "Client authentication failed: code",
"error": "invalid_grant",
"error_uri": "https://topiam.cn/docs/application/oidc/faq/#错误码"
}