當前位置:
首頁 > 最新 > 與第三方應用對接技術文檔,怎麼能不知道OAuth2.0?

與第三方應用對接技術文檔,怎麼能不知道OAuth2.0?

下一秒

 微微一笑很傾城 電視劇原聲帶

張碧晨 

00:00/03:14

OAuth是一個關於授權(authorization)的開放網路標準,只要授權方和被授權方遵守這個協議去寫代碼提供服務,那雙方就是實現了OAuth模式。

一、應用場景

如果用戶想要使用一個第三方的應用(客戶端)來沖洗自己存儲在Google的的照片,這個客戶端就要得到用戶的授權,才可以調用這些照片,傳統方法是,用戶將自己在Google的用戶名和密碼,告訴客戶端,客戶端就可以讀取用戶的照片了。但是,這樣的做法有以下幾個嚴重的缺點:

為了後續的服務,客戶端會保存用戶的密碼,這樣很不安全。

Google不得不部署密碼登錄,但單純的密碼登錄並不安全。

客戶端擁有了獲取用戶儲存在Google所有資料的權力,用戶沒法限制客戶端獲得授權的範圍和有效期。

用戶只有修改密碼,才能收回賦予客戶端的權力。但這樣做會使得其他所有獲得用戶授權的第三方應用程序全部失效。

只要有一個第三方應用程序被破解,就會導致用戶密碼泄漏,以及所有被密碼保護的數據泄漏。

有了OAuth的存在,就可以解決上面這些問題了,OAuth的作用就是讓"客戶端"安全可控地獲取"用戶"的授權,與"服務商提供商"進行互動。

二、解決方式

OAuth在"客戶端"與"服務提供商"之間,設置了一個授權層(authorization layer)。"客戶端"不能直接登錄"服務提供商",只能登錄授權層,以此將用戶與客戶端區分開來。"客戶端"登錄授權層所用的令牌(token),與用戶的密碼不同。用戶可以在登錄的時候,指定授權層令牌的許可權範圍和有效期。

"客戶端"登錄授權層以後,"服務提供商"根據令牌的許可權範圍和有效期,向"客戶端"開放用戶儲存的資料。

三、運行流程

四、客戶端的授權模式

客戶端必須得到用戶的授權(authorization grant),才能獲得令牌(access token)。OAuth 2.0定義了四種授權方式。

授權碼模式(authorization code)

簡化模式(implicit)

密碼模式(resource owner password credentials)

客戶端模式(client credentials)

今天先來講解比較主流的兩種吧!

(一)授權碼模式

是功能最完整、流程最嚴密的授權模式。它的特點就是通過客戶端的後台伺服器,與"服務提供商"的認證伺服器進行互動。

下面是上面這些步驟所需要的參數。

A步驟中,客戶端申請認證的URI,包含以下參數:

response_type:表示授權類型,必選項,此處的值固定為"code"

client_id:表示客戶端的ID,必選項

redirect_uri:表示重定向URI,可選項

scope:表示申請的許可權範圍,可選項

state:表示客戶端的當前狀態,可以指定任意值,認證伺服器會原封不動地返回這個值。

下面是一個例子。

C步驟中,伺服器回應客戶端的URI,包含以下參數:

code:表示授權碼,必選項。該碼的有效期應該很短,通常設為10分鐘,客戶端只能使用該碼一次,否則會被授權伺服器拒絕。該碼與客戶端ID和重定向URI,是一一對應關係。

state:如果客戶端的請求中包含這個參數,認證伺服器的回應也必須一模一樣包含這個參數。

下面是一個例子。

D步驟中,客戶端向認證伺服器申請令牌的HTTP請求,包含以下參數:

grant_type:表示使用的授權模式,必選項,此處的值固定為"authorization_code"。

code:表示上一步獲得的授權碼,必選項。

redirect_uri:表示重定向URI,必選項,且必須與A步驟中的該參數值保持一致。

client_id:表示客戶端ID,必選項。

下面是一個例子。

E步驟中,認證伺服器發送的HTTP回復,包含以下參數:

access_token:表示訪問令牌,必選項。

token_type:表示令牌類型,該值大小寫不敏感,必選項,可以是bearer類型或mac類型。

expires_in:表示過期時間,單位為秒。如果省略該參數,必須其他方式設置過期時間。

refresh_token:表示更新令牌,用來獲取下一次的訪問令牌,可選項。

scope:表示許可權範圍,如果與客戶端申請的範圍一致,此項可省略。

下面是一個例子。

從上面代碼可以看到,相關參數使用JSON格式發送(Content-Type: application/json)。此外,HTTP頭信息中明確指定不得緩存。

(二)密碼模式

密碼模式(Resource Owner Password Credentials Grant)中,用戶向客戶端提供自己的用戶名和密碼。客戶端使用這些信息,向"服務商提供商"索要授權。

在這種模式中,用戶必須把自己的密碼給客戶端,但是客戶端不得儲存密碼。這通常用在用戶對客戶端高度信任的情況下,比如客戶端是操作系統的一部分,或者由一個著名公司出品。而認證伺服器只有在其他授權模式無法執行的情況下,才能考慮使用這種模式。

B步驟中,客戶端發出的HTTP請求,包含以下參數:

grant_type:表示授權類型,此處的值固定為"password",必選項。

username:表示用戶名,必選項。

password:表示用戶的密碼,必選項。

scope:表示許可權範圍,可選項。

C步驟中,認證伺服器向客戶端發送訪問令牌,下面是一個例子。

整個過程中,客戶端不得保存用戶的密碼。

五、更新令牌

如果用戶訪問的時候,客戶端的"訪問令牌"已經過期,則需要使用"更新令牌"申請一個新的訪問令牌。

客戶端發出更新令牌的HTTP請求,包含以下參數:

grant_type:表示使用的授權模式,此處的值固定為"refreshtoken",必選項。

refresh_token:表示早前收到的更新令牌,必選項。

scope:表示申請的授權範圍,不可以超出上一次申請的範圍,如果省略該參數,則表示與上一次一致。

下面是一個例子。

今天就講到這裡,下期會補充其他的兩種方式,敬請期待哦~

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 產品經理的孤獨逃亡 的精彩文章:

TAG:產品經理的孤獨逃亡 |