OAuth2.0接入

最近更新时间:9/25/2023, 10:15:37 AM作者:dreamlli(李卓钊)

OAuth2.0接入(new)

配置项清单

初始化过程中,工业云和合作方需要交换的配置项信息如下:

工业云提供

  • client_id:客户端标识,用于表示合作方应用在此租户下的唯一标识。
  • client_secret:客户端密钥,和client_id一一对应。
  • authorize_uri:登录地址,合作方应用未登录时需要重定向到此地址发起登录授权请求。
  • token_uri:请求令牌地址,合作方应用使用一次性授权码获取用户访问令牌。
  • userinfo_uri:获取用户信息地址,合作方应用使用令牌获取用户详细信息。

合作方提供

  • redirect_uri:回调URI,用于接收工业云发出的授权码。

单点登录(SSO)

流程介绍

  1. 合作方应用将用户浏览器重定向到工业云,携带客户端标识、回调 URI;
  2. 用户登录工业云进行身份认证与授权;
  3. 工业云返回访问令牌Access Token;
  4. 合作方应用使用Access Token向工业云请求用户信息;
  5. 工业云返回此次登录的用户信息。

对接步骤

1.用户未登录状态下,合作方应用需要重定向到工业云的authorize_uri进行身份认证,并携带参数如下:

https://{工业云域名}/oauth2/authorize?nonce=all&client_id=xxxx&response_type=code&scope=all&redirect_uri=xxxxx&state=xxxx

其中相关参数的含义如下

参数名 示例 含义
response_type code 固定为此值,表示为请求返回内容
state xxxx 非必传,CSRF安全参数,合作方应用客户端随机生成一串字符串,工业云认证完会原封不动返回此参数
scope all 多值属性,以空格分割。表示需要请求的用户信息范围
client_id xxxxx 客户端标识,用于表示合作方应用在此租户下的唯一标识。
redirect_uri https://xxxx 回调URI,用于接收工业云发出的授权码。

2.工业云会跳转到合作方应用的回调地址redirect_uri,携带授权码 code。code 是由工业云生成的随机字符串,若第一步携带了 state,也会返回原始 state。

跳转第一步返回的URL
https://redirect_uri?code=xxx&state=xxxx

3.合作方应用的回调地址接收到 code 之后,需要调用工业云的 token 接口获取 access_token。

工业云会提供一个 token 接口供合作方应用调用,此处为服务端之间的调用,浏览器不可见:

POST   https://{工业云域名}/iamapp/api/v1/DescribeAccessToken
Headers:
  Authorization: Basic {Base64:[client_id:client_secret]}
Body(form-data):
grant_type=authorization_code&code={code}&redirect_uri=xxxxxxx
​

其中涉及的参数含义如下:

参数名 示例 传入方式 含义
Authorization Basic {Base64:[client_id:client_secret]} header 合作方应用需要使用 BasicAuth 的方式,传入 client_id 和 client_secret。具体操作方式为,将 client_id 加上“:”再加上 client_secret 拼接成字符串,进行 Base64 编码得到一个新的字符串,并在这串字符串前加上 Basic,中间留一个空格,得到最终需要的字符串。 具体操作方式为,将 client_id 加上“:”再加上 client_secret 拼接成字符串,进行 Base64 编码得到一个新的字符串,并在这串字符串前加上 Basic,中间留一个空格,得到最终需要的字符串。 非必传,CSRF安全参数,合作方应用客户端随机生成一串字符串,工业云认证完会原封不动返回此参数
grant_type authorization_code form表单 固定为此值,表示为授权码模式
code xxxx form表单 多值属性,以空格分割。表示需要请求的用户信息范围
redirect_uri https://xxxx form表单 回调URI,用于接收工业云发出的授权码

4.工业云接收到请求 Token 后,会验证 client_id、client_secret 以及 code、redirect_uri,验证成功之后会返回 JSON 格式的 token,如下所示:

HTTP/1.1  200 OK 
 Content-Type: application/json 
​
{
    "access_token": "xxxxxxx",
    "token_type": "Bearer",
    "expires_in": 3600,
    "RequestId":"xxxxxx"
}
​

其中:

参数名 示例 含义
access_token xxxx 请求 token,用于请求详细用户信息。
RequestId xxxx 用于定位问题的id
token_type Bearer 固定为 Bearer,后续请求用户信息时需要使用此种验证方式
expires_in 3600 表示 token 过期时间,单位:秒

5.合作方应用使用 access_token 向工业云的 userinfo_uri 接口请求身份信息。此处为服务端之间的调用,请求如下所示:

GET  https://{工业云域名}/iamapp/api/v1/DescribeUserInfo
​
Content-Type:  application/json 
Authorization: Bearer {access_token}
​

其中:

参数名 示例 传入方式 含义
Authorization Bearer {access_token} header 合作方应用需要使用Bearer的方式,将上一步获取的 access_token,在其前面加上 Bearer 和一个空格,得到一个新的字符串。

6.工业云接收到 UserInfo 的请求后,验证 access_token 成功之后,返回信息如下,合作方应用根据此处返回的用户信息,登录对应的账号:

HTTP/1.1  200 OK 
Content-Type: application/json 
​
{
    "name": "zhangsan",
    "id": "123",
    "email":"zhangsan@tencent.com",
    "RequestId":"xxxx"
    "type":1
     "tenantId":"123456"
     "tenantName":"lisi"
}
​

其中:

参数名 示例 含义
id 123 用户在工业云唯一 ID
name 张三 用户在工业云的显示名称
email zhangsan@tencent.com 用户在工业云的邮箱
RequestId Xxxx 请求id,定位问题使用
type 1 账号类型,1:主账户 2:子账户
tenantId 123456 租户ID,账号为主账号时租户ID为账号id
tenantName 租户名称 租户名称

7.合作方需提供一个logout接口,支持入参id 为工业用户id,工业登出时会异步调用该接口通知三方应用登出。 调用示例:

curl --location --request POST 'https://www.thirdapp.com/logout' \--header 'Content-Type: application/json' \--data-raw '{"id":"xxx"}'