說明
本文檔主要描述移動端和案頭用戶端如何通過 OAuth2.0 介面接入 PDS。
1. 介紹
由於是端應用,您的應用中無法存放機密資訊,比如 App 的 secret。
對於移動端(Android, IOS),一般是要喚醒授權App授權,需要使用 URL Scheme。
對於案頭用戶端(mac,linux windows 案頭端),可以通過迴環IP地址(Loopback IP address)喚醒授權端, 也可以通過 URL Scheme。
還有一種方式也比較常用,就是通過webview 請求Web服務應用的方式。
(1) 原理:
授權碼模式:同Web服務應用接入的授權碼模式基本相同,除了擷取token的步驟不需要提供Secret參數(因為沒有Web服務端,而secret不能放在用戶端)。
(2) 使用案例圖

2. 接入前提
(1) 建立Domain
首先,您需要在 PDS 官網控制台 https://pds.console.aliyun.com建立一個域(Domain)。建立完成後,會提供一個3級API網域名稱 https://{domainId}.api.aliyunpds.com
。
(2) 開啟使用者體系登入
PDS提供了幾種常用的使用者體系登入認證方式,開發人員可以直接到PDS控制台開啟對接。詳情請看PDS支援的使用者體系介紹。
(3) 建立App(Client)
建立App,選擇類型為”Native應用”。確定App的訪問Scope, 這個Scope要在使用者授權頁面展示。建立完成,可以得到 AppId(ClientId) 和 Secret(ClientSecret)。這個是授權認證的憑證,Secret要注意保密不要泄露。
(4) 規劃 redirect_uri
自訂URL Scheme(Android, iOS)
APP需要註冊自己的URL Scheme,用來唯一標識一個App。Scheme格式:<scheme網域名稱>://<path>?<params>=<value>
自訂Lookback IP Address(案頭用戶端)
可以啟動一個本地Web服務,監聽連接埠,如 : http://127.0.0.1:3000/callback
或者 http://[::1]:3000
3. 擷取 OAuth2.0 Access Token 步驟
(1) /authorize 介面
API 請求文法:
GET /v2/oauth/authorize?client_id=<appId>&redirect_uri=<redirect_uri>&scope=<scope>&login_type=<login_type>&state=[state]&prompt=[prompt] HTTP/1.1
Host: {domainId}.api.aliyunpds.com
參數 | 是否必選 | 描述 |
client_id | 是 | AppId, 如果沒有請到官網控制台去建立。 |
redirect_uri | 是 | 回調地址:告訴認證服務在授權認證流程完成後重新導向到哪裡。一般是您的用戶端應用提供的一個URL Scheme或者LookBack IP Address。比如:pdshz001://callback/ , 認證服務在授權完成後,會redirect到這個地址並且帶上一次性的code: pdshz001://callback/?code=xxxx ,然後您需要使用這個code完成後續流程。 注意:這個redirect_uri 必須和您建立App時填寫的redirect_uri 一致。 |
scope | 是 | 存取範圍列表,描述您的Web服務應用需要的存取權限範圍,將在使用者同意授權頁面展示。請看:Scope說明。 |
response_type | 是 | 此處固定為”code ” |
state | 否,但推薦使用 | 如果請求中包含這個參數,證明伺服器在重新導向的時候會原封不動返回, 用於防止重放攻擊。如:pdshz001://callback/?code=xxxx&state=abc 。 |
login_type | 是 | 登入選項, 可選:['default','phone','ding','ldap','wx','ram'] 。 default 表示預設的登入頁面(頁麵包含手機號登入和其他登入連結),phone 表示手機號登入,ding 表示DingTalk掃碼登入,ldap 表示LDAP/AD域登入,wx 表示企業微信登入,ram 表示阿里雲RAM子帳號登入。 |
hide_consent | 否 | 在使用者第一次登入完成後,是否需要展示 consent 頁面。可選值:true , false 。如果為true 則不展示,直接跳過。 |
lang | 否 | 介面展示的語言。目前支援:zh_CN ,en_US 。預設:zh_CN 。 |
發送此請求後,PDS Auth服務會引導使用者去登入。使用者登入完成後,如果使用者是第一次登入且沒有傳入參數 hide_consent=true
,則會重新導向到 consent 頁面,否則會直接重新導向到請求參數中的 redirect_uri
,比如:pdshz001://callback/?code=xxxx&state=abc
。
(2) Consent 頁面
在此步驟中,使用者可以決定是否授權給Web服務應用。如果不同意授權,則流程終止。 如果同意授權,將重新導向到第一步請求中的 redirect_uri
, 比如:pdshz001://callback/?code=xxxx&state=abc
。
(3) 通過 code 擷取 AccessToken
應用擷取到 code 後,調用下面的介面換取 AccessToken。
API 請求文法:
POST /v2/oauth/token HTTP/1.1
Host: {domainId}.api.aliyunpds.com
Content-Type: application/x-www-form-urlencoded
code=xxx\
&client_id=your_app_id\
&redirect_uri=pdshz001:
&grant_type=authorization_code
參數 | 是否必選 | 描述 |
code | 是 | 一次性code,使用過一次後即失效。 |
client_id | 是 | AppId |
redirect_uri | 是 | 這個redirect_uri 必須和您建立App時填寫的redirect_uri 一致。 |
grant_type | 是 | 根據OAuth2.0規範,此處的值固定為”authorization_code”。 |
返回:
名稱 | 位置 | 類型 | 必選 | 說明 |
access_token | body | string | 是 | 產生的 id_token,有效期間2小時。 |
expires_time | body | string | 是 | access_token 的有效期間。 |
expire_in | body | string | 是 | 失效時間。單位秒。 |
token_type | body | string | 是 | 固定為 Bearer |
範例:
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token":"Aiasd76Y****...LSdyssd2",
"expires_time":"2019-11-11T10:10:10.009Z",
"expire_in": 7200,
"token_type":"Bearer",
"refresh_token":"LSLKdklksd...li3ew6"
}
說明
本次請求的傳回值與用授權碼換取存取權杖的傳回值一致,但不包含 refresh_token。
4. 調用 PDS 服務 API
用戶端可以直接使用 AccessToken 調用 PDS API。只需在要求標頭的Authorization中帶上AccessToken。
調用方式詳細請參考調用方式。
5. 重新整理Token
(1) 請求方式舉例:
POST /v2/oauth/token HTTP/1.1
Host: {domainId}.api.aliyunpds.com
Content-Type: application/x-www-form-urlencoded
refresh_token=xxx\
&client_id=xxx\
&grant_type=refresh_token
請求參數
參數名稱 | 是否必選 | 描述 |
refresh_token | 是 | 用授權碼換取存取權杖時獲得的重新整理權杖。 |
client_id | 是 | 應用的身份 ID。 |
grant_type | 是 | 根據 OAuth 2.0 協議, 取值為:refresh_token。 |
client_secret | 否 | 應用的密鑰,用作換取存取權杖時評鑑應用身份的密碼。 |
(2) 返回
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token":"xxxxxxxxx",
"expires_in":3920,
"expire_time":"2019-11-11T10:10:10.009Z",
"token_type":"Bearer"
}
返回參數
同 (3) 通過 code 擷取 AccessToken 返回結構一樣。