授权码模式
用户访问第三方应用时,第三方应用向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
请求参数
参数名 | 中文名称 | 必须 | 示例值 | 描述 |
---|---|---|---|---|
client_id | 客户端ID | 是 | 2bae87d88feb129f817a1ce52d798e0b | 申请接入后分配给第三方应用的clientid。 |
response_type | 授权类型 | 是 | code | 此值固定为 code,代表采用授权码模式。 |
redirect_uri | 回调地址 | 是 | https://127.0.0.1:8080/login/oauth2 | 授权后的回调地址,必须是注册应用时填写的可信域名一致,需要将url进行URLEncode编码。 |
state | state | 可选 | 29f817a1c | 用于防止CSRF攻击,成功授权后回调时会原样带回,请检查用户与state状态绑定。 |
scope | scope范围 | 可选 | openid profile | 可选值openid email phone profile。 |
响应参数
如果用户成功登录并授权,则会跳转到指定的回调地址,并在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/#错误码
获取token
请求说明
请求方式:POST
请求地址:https://{your_domain}/api/v1/authorize/{app_code}/oauth2/token
请求头
参数名 | 中文名称 | 必须 | 示例值 | 描述 |
---|---|---|---|---|
Authorization | 认证信息 | 是 | Basic MTk4MzhkOTc0ZTM= | 使用client_id和client_secret进行basic64认证,格式为: base64(client_id:client_secret)。 |
Content-Type | 数据类型 | 是 | application/x-www-form-urlencoded | 使用表单方式提交参数。 |
请求示例
POST https://{your_domain}/api/v1/oauth2/token
Authorization: Basic MmJhZTg3ZDx....GUxYmIzYc0ZTM=
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。 |
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 | |
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/#错误码"
}
code 无效或已过期
{
"error_description": "The authorization code is invalid or has expired.",
"error": "invalid_grant",
"error_uri": "https://topiam.cn/docs/application/oidc/faq/#%E9%94%99%E8%AF%AF%E7%A0%81"
}
client_id 或 client_secret 错误
{
"error_description": "Client authentication failed. Either the client or the client credentials are invalid.",
"error": "invalid_client",
"error_uri": "https://topiam.cn/docs/application/oidc/faq/#错误码"
}