本文介紹Web應用如何通過OAuth 2.0扮演登錄用戶訪問阿里云API。
前提條件
基本流程
用戶通過瀏覽器登錄Web應用。
Web應用重定向到阿里云OAuth 2.0服務并將URL返回給瀏覽器。
說明如果用戶還未登錄,則會進一步重定向到阿里云登錄服務。
用戶通過瀏覽器登錄阿里云OAuth 2.0服務并申請授權碼。
阿里云OAuth 2.0服務重定向到Web應用并返回授權碼給瀏覽器。
瀏覽器通過Web應用使用授權碼向阿里云OAuth 2.0服務申請代表用戶身份的令牌。
阿里云OAuth 2.0服務向Web應用返回訪問令牌(access_token)。
Web應用通過獲取的訪問令牌(access_token)向阿里云發起訪問API的請求。
說明由于訪問令牌(access_token)可以代表用戶身份,因此應用可以訪問當前用戶的資源。
獲取訪問令牌
Web應用通過瀏覽器將用戶重定向到阿里云OAuth 2.0服務從而獲取授權碼。
授權碼的請求地址:
https://signin.aliyun.com/oauth2/v1/auth
。表 1. 請求參數 參數名稱
是否必選
描述
client_id
是
應用ID。
redirect_uri
是
創建應用時填寫的重定向URL之一。
response_type
是
返回類型。根據OAuth 2.0協議,目前支持設置此參數的取值為code。
scope
否
空格分隔的OAuth范圍列表。如不指定此參數取值,則默認為應用的全部OAuth范圍。
access_type
否
應用的訪問類型。取值分為兩種類型:
online:應用不需要離線刷新訪問令牌。
offline:針對離線訪問類型的請求,會發放刷新令牌,應用可以根據需求持續刷新訪問令牌。
默認取值為online。
state
否
應用通過state 參數實現多種目的,例如:狀態保持、作為nonce使用從而減少CSRF威脅等。state如果設置為任意字符串,阿里云OAuth2.0服務會將請求中的state參數及取值原樣放到返回參數中以供后續使用。
prompt
否
該參數用于指定服務器是否需要提示用戶進行授權操作。
如果指定,會強制要求用戶進行授權,即使該阿里云賬號已經做過授權,也需要重新授權。如果不指定,則只在該阿里云賬號第一次使用該應用時要求授權。
取值:
admin_consent
,表示服務端會在向客戶端返回信息之前展示授權頁面。請求示例
https://signin.aliyun.com/oauth2/v1/auth? client_id=123****& redirect_uri=https://example.com/authcallback/& response_type=code& scope=openid /acs/ccc& access_type=offline& state=123456****
返回示例
GET HTTP/1.1 302 Found Location: https://example.com/authcallback/?code=ABAFDGDFXYZW888&state=123456****
Web應用使用授權碼向阿里云OAuth 2.0服務申請代表用戶身份的令牌。
換取訪問令牌的請求地址:
https://oauth.aliyun.com/v1/token
。表 2. 請求參數 參數名稱
是否必選
描述
code
是
初始請求中獲取的授權碼。
client_id
是
應用ID。
redirect_uri
是
初始請求中設置的參數。
grant_type
是
根據OAuth 2.0協議, 取值為authorization_code。
client_secret
否
應用密鑰,用作換取訪問令牌時鑒定應用身份的密碼。
請求示例
POST /v1/token HTTP/1.1 Host: oauth.aliyun.com Content-Type: application/x-www-form-urlencoded code=ABAFDGDFXYZW888& client_id=123****& client_secret=`your_client_secret`& redirect_uri=https://example.com/authcallback/& grant_type=authorization_code
表 3. 返回參數 參數名稱
描述
access_token
訪問令牌。
訪問令牌可以代表用戶身份,應用使用此訪問令牌來訪問阿里云API。應用不需要理解訪問令牌的含義,直接使用即可。
expires_in
訪問令牌的剩余有效時間,單位為秒。
token_type
訪問令牌的類型。取值為Bearer。
id_token
身份令牌。
身份令牌為OAuth簽名的JWT(JSON Web Token)。如果初始請求的scope參數包含了openid,則返回身份令牌。
refresh_token
刷新令牌。
如果初始請求時應用的訪問類型為offline,則返回刷新令牌。
scope
獲取的授權碼的實際授權范圍。
如果應用需要的授權范圍不止
openid
,那么您需要校驗獲取的scope是否符合預期。如果您安裝的應用未授權指定的scope,請您重新授權。重新授權的方法:通過
https://signin.aliyun.com/oauth2/v1/auth
請求授權碼時,設置參數prompt=admin_consent
。返回示例
{ "access_token": "eyJraWQiOiJrMTIzNCIsImVu****", "token_type": "Bearer", "expires_in": "3600", "refresh_token": "Ccx63VVeTn2dxV7ovXXfLtAqLLERA****", "id_token": "eyJhbGciOiJIUzI1****", "scope": "openid /acs/ccc" }
獲取新的訪問令牌
換取訪問令牌的請求地址:https://oauth.aliyun.com/v1/token
。
參數名稱 | 是否必選 | 描述 |
refresh_token | 是 | 用授權碼換取訪問令牌時獲得的刷新令牌。 |
client_id | 是 | 應用ID。 |
grant_type | 是 | 根據OAuth 2.0協議, 取值為refresh_token。 |
client_secret | 否 | 應用密鑰,用作換取訪問令牌時鑒定應用身份的密碼。 |
請求示例
POST /v1/token HTTP/1.1
Host: oauth.aliyun.com
Content-Type: application/x-www-form-urlencoded
refresh_token=Ccx63VVeTn2dxV7ovXXfLtAqLLERAH1Bc&
client_id=123****&
client_secret=`your_client_secret`&
grant_type=refresh_token
參數名稱 | 描述 |
access_token | 新的訪問令牌。應用可以使用新的訪問令牌來訪問阿里云API。 |
expires_in | 訪問令牌的剩余有效時間,單位為秒。 |
token_type | 訪問令牌的類型。取值為Bearer。 |
返回示例
{
"access_token": "eyJraWQiOiJrMTIzNCIsImVu****",
"token_type": "Bearer",
"expires_in": "3600"
}
撤銷刷新令牌
Web應用獲取了刷新令牌后,在用戶退出登錄應用或用戶將自己的賬號從應用中移除時,必須撤銷刷新令牌。
撤銷刷新令牌的請求地址:https://oauth.aliyun.com/v1/revoke
。
參數名稱 | 是否必選 | 描述 |
token | 是 | 需要撤銷的刷新令牌。 |
client_id | 是 | 應用ID。 |
client_secret | 否 | 應用密鑰。 |