官术网_书友最值得收藏!

  • OAuth 2實戰寶典
  • 糜鵬程編著
  • 2154字
  • 2024-01-18 11:43:21

1.2.2 授權碼授權模式

1.授權請求示例

授權碼授權(Authorization Code Grant)模式是一種應用廣泛、安全可靠的授權模式,前期的授權流程類似隱式授權模式,不同之處在于授權碼授權模式不再直接返回access_token,而是返回有效期較短的code。第三方應用在獲取code的請求后,在后臺使用code、client_id和client_secret,通過HttpClient發起post請求,從而獲取一個內容豐富的token。具體的授權流程如下。

步驟1 獲取code的請求,如示例1.3所示。

示例1.3 獲取code的請求

示例1.3中各參數的含義如下。

? client_id:第三方應用在開放平臺注冊完成后獲取的唯一標識。

? response_type:在授權碼授權模式中,該參數的值為code。

? redirect_url:第三方應用在開放平臺注冊的回調地址。

? state:由第三方應用指定,當授權系統回調到第三方應用時,會在回調請求中攜帶該參數值。在回調到第三方應用時,授權系統會原封不動地將第三方應用傳遞的state參數回傳給第三方應用。

提示

第三方應用通常使用state參數進行校驗或冪等操作。

? scope:第三方應用的訪問權限,一般由逗號分隔的多個字符串組成。

步驟2 假設回調地址為https://example.com/callback,第三方應用在引導用戶訪問示例1.3后,會跳轉到登錄頁面。在用戶登錄成功后,授權系統會生成code,并通過預設的回調地址回調到第三方應用。示例1.4所示為code回調請求示例。

示例1.4 code回調請求示例

示例1.4中各參數的含義如下。

? https://example.com/callback:第三方應用預設的回調地址,授權系統會直接回調到該地址。

? state:在步驟1中由第三方應用傳入的參數,在回調到第三方應用時會原封不動地回傳。

? code:步驟1 請求的目標結果。第三方應用將使用code換取用戶授權的access_token。

步驟3 第三方應用在獲取code后,會在程序后臺通過HttpClient,主動發起請求,獲取用戶授權的access_token。第三方應用創建的access_token請求如示例1.5所示。

示例1.5 access_token請求

示例1.5中各參數的含義如下。

? client_id:第三方應用在開放平臺注冊完成后獲取的唯一標識。

? client_secret:第三方應用在開放平臺注冊完成后獲取的密碼。

? code:步驟2中獲取的code回調請求。

? grant_type:OAuth 2規定在授權碼授權模式下,該字段的值為authorization_code。授權系統會根據該字段進行授權模式區分,即授權系統會根據該字段識別到當前模式為授權碼授權模式,從而執行該模式下必要參數的校驗和授權邏輯。

步驟4 授權系統收到請求并進行驗證,在驗證通過后,會返回如示例1.6所示的授權信息給第三方應用。

示例1.6 授權信息

示例1.6中各參數的含義如下。

? access_token:訪問令牌,是用戶授權的唯一憑證。使用此令牌訪問開放平臺的網關,從而獲取數據或調用功能。

? expires_in:token的過期時間,單位為秒。

? refresh_token:刷新token,可對access_token進行續期。

? refresh_expires_in:刷新token的有效時間,單位為秒。

? open_id:用戶在第三方應用的唯一標識。

? scope:第三方應用的訪問權限,一般由逗號分隔的多個字符串組成。

? token_type:access_token的類型。

步驟5 第三方應用在獲取信息后,首先根據open_id將用戶綁定到系統中,然后使用refresh_token刷新access_token的有效期。這是因為open_id可用于識別用戶并保存相關信息,access_token可調用用戶在開放平臺的相關資源。

由于第三方應用有刷新access_token的需求,因此在授權碼授權模式下,授權系統為第三方應用提供刷新access_token的接口。刷新授權信息請求如示例1.7所示。

示例1.7 刷新授權信息請求

示例1.7中各參數的含義如下。

? client_id:第三方應用在開放平臺注冊完成后獲取的唯一標識。

? client_secret:第三方應用在開放平臺注冊完成后獲取的密碼。

? grant_type:在刷新access_token時,該字段的值為refresh_token,開放平臺會根據該字段識別出當前第三方應用正在發起刷新access_token請求,從而進行刷新access_token時的必要參數校驗,并在校驗通過后執行刷新access_token的具體邏輯。

? refresh_token:示例1.6中獲取的refresh_token。

第三方應用發起示例1.7的請求后,會得到與示例1.6類似的授權信息,不過返回的內容會不同,即可能生成新的access_token或使用原來的token。不同的系統會有不同的策略,在后續章節中再繼續討論。

2.系統交互流程

前文通過獲取code、獲取授權信息和刷新授權信息這3個子流程介紹了授權的完整生命周期。授權碼授權模式的流程如圖1-2所示。

步驟1 用戶訪問第三方應用。

步驟2 第三方應用引導用戶向授權系統發起獲取code的請求。

步驟3 首先授權系統進行初步校驗,校驗參數是否合法,如client_id是否存在,redirect_url是否一致等;然后重定向到認證系統,發起用戶認證。

步驟4 用戶在認證系統中進行登錄,登錄成功后認證系統會回調到授權系統。授權系統在獲取用戶信息、進行必要的授權流程后生成access_token。

圖1-2 授權碼授權模式的流程

步驟5 授權系統重定向到第三方應用的回調地址。

步驟6 第三方應用在后臺使用code換取用戶授權的access_token。

步驟7 授權系統返回完整的授權信息。

提示

自此已獲取用戶授權的access_token信息,用戶可以調用相關接口實現相關業務。后續步驟為第三方應用通過刷新access_token來維持access_token的有效性。

步驟8 使用refresh_token刷新token。

步驟9 授權系統向第三方應用返回完整的授權信息。

總結

授權碼授權模式是在實際工作中應用最多的授權模式,有如下優點。

? 可靈活設置access_token的過期時間,第三方應用可以根據需求來刷新access_token的過期時間,從而滿足不同的業務需求。access_token的有效期越長,對第三方應用的負擔越輕,同時安全性也越低。反之,access_token的有效期越短,對第三方應用的負擔越重,同時安全性也越高。詳細內容在后文中有相關介紹。

? access_token是第三方應用通過后端通道請求獲取的,不會展示在瀏覽器上。授權系統可以設置https服務,第三方應用會強制使用https獲取access_token,確保信息不被攔截。

? code會展示在瀏覽器的URL中(見示例1.4),這樣就把code暴露在了用戶可見的前端通道中,但code有效期短且只能使用一次,因此code需要配合client_secret(第三方應用密碼,不會泄露給任何人)才能使用,確保了只有第三方應用才能使用code獲取授權信息。

主站蜘蛛池模板: 泾阳县| 苍梧县| 巴南区| 汪清县| 夹江县| 丰城市| 缙云县| 扎兰屯市| 杨浦区| 穆棱市| 扶风县| 繁峙县| 合水县| 正定县| 大姚县| 长宁县| 华容县| 罗平县| 亳州市| 宣武区| 志丹县| 康定县| 囊谦县| 扬州市| 思茅市| 高青县| 子洲县| 泽普县| 巩留县| 阿拉善右旗| 尼木县| 四会市| 云梦县| 怀柔区| 广州市| 临清市| 临江市| 延长县| 海安县| 桐梓县| 蓬安县|