OAuth 2 0介紹

2022-09-22 20:48:00 字數 3149 閱讀 4042

oauth是一個關於授權(authorization)的開放網路標準,在全世界得到廣泛應用,目前的版本是2.0版。

為了理解oauth的適用場合,讓我舉一個假設的例子。

有一個"雲沖印"的**,可以將使用者儲存在google的**,衝印出來。使用者為了使用該服務,必須讓"雲沖印"讀取自己儲存在google上的**。

問題是隻有得到使用者的授權,google才會同意"雲沖印"讀取這些**。那麼,"雲沖印"怎樣獲得使用者的授權呢?

傳統方法是,使用者將自己的google使用者名稱和密碼,告訴"雲沖印",後者就可以讀取使用者的**了。這樣的做法有以下幾個嚴重的缺點。

(1)"雲沖印"為了後續的服務,會儲存使用者的密碼,這樣很不安全。

(2)google不得不部署密碼登入,而我們知道,單純的密碼登入並不安全。

(3)"雲沖印"擁有了獲取使用者儲存在google所有資料的權力,使用者沒法限制"雲沖印"獲得授權的範圍和有效期。

(4)使用者只有修改密碼,才能收回賦予"雲沖印"的權力。但是這樣做,會使得其他所有獲得使用者授權的第三方應用程式全部失效。

(5)只要有一個第三方應用程式被破解,就會導致使用者密碼洩漏,以及所有被密碼保護的資料洩漏。

oauth就是為了解決上面這些問題而誕生的。

在詳細講解oauth 2.0之前,需要了解幾個專用名詞。它們對讀懂後面的講解,尤其是幾張圖,至關重要。

(5)authorization server:認證伺服器,即服務提供商專門用來處理認證的伺服器。

(6)resource server:資源伺服器,即服務提供商存放使用者生成的資源的伺服器。它與認證伺服器,可以是同一臺伺服器,也可以是不同的伺服器。

知道了上面這些名詞,就不難理解,oauth的作用就是讓"客戶端"安全可控地獲取"使用者"的授權,與"服務商提供商"進行互動。

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

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

oauth 2.0的執行流程如下圖,摘自rfc 6749。

(1)使用者開啟客戶端以後,客戶端要求使用者給予授權。

(2)使用者同意給予客戶端授權。

(3)客戶端使用上一步獲得的授權,向認證伺服器申請令牌。

(4)認證伺服器對客戶端進行認證以後,確認無誤,同意發放令牌。

(5)客戶端使用令牌,向資源伺服器申請獲取資源。

(6)資源伺服器確認令牌無誤,同意向客戶端開放資源。

不難看出來,上面六個步驟之中,2是關鍵,即使用者怎樣才能給於客戶端授權。有了這個授權以後,客戶端就可以獲取令牌,進而憑令牌獲取資源。

下面一一講解客戶端獲取授權的四種模式。

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

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

它的步驟如下:

(1)使用者訪問客戶端,後者將前者導向認證伺服器。

(2)使用者選擇是否給予客戶端授權。

(3)假設使用者給予授權,認證伺服器將使用者導向客戶端事先指定的"重定向uri"(redirection uri),同時附上一個授權碼。

(4)客戶端收到授權碼,附上早先的"重定向uri",向認證伺服器申請令牌。這一步是在客戶端的後臺的伺服器上完成的,對使用者不可見。

(5)認證伺服器核對了授權碼和重定向uri,確認無誤後,向客戶端傳送訪問令牌(access token)和更新令牌(refresh token)。

簡化模式(implicit grant type)不通過第三方應用程式的伺服器,直接在瀏覽器中向認證伺服器申請令牌,跳過了"授權碼"這個步驟,因此得名。所有步驟在瀏覽器中完成,令牌對訪問者是可見的,且客戶端不需要認證。

它的步驟如下:

(1)客戶端將使用者導向認證伺服器。

(2)使用者決定是否給於客戶端授權。

(3)假設使用者給予授權,認證伺服器將使用者導向客戶端指定的"重定向uri",並在uri的hash部分包含了訪問令牌。

(4)瀏覽器向資源伺服器發出請求,其中不包括上一步收到的hash值。

(5)資源伺服器返回一個網頁,其中包含的**可以獲取hash值中的令牌。

(6)瀏覽器執行上一步獲得的指令碼,提取出令牌。

(7)瀏覽器將令牌發給客戶端。

密碼模式(resource owner password credentials grant)中,使用者向客戶端提供自己的使用者名稱和密碼。客戶端使用這些資訊,向"服務商提供商"索要授權。

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

客戶端模式(client credentials grant)指客戶端以自己的名義,而不是以使用者的名義,向"服務提供商"進行認證。嚴格地說,客戶端模式並不屬於oauth框架所要解決的問題。在這種模式中,使用者直接向客戶端註冊,客戶端以自己的名義要求"服務提供商"提供服務,其實不存在授權問題。

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

OAuth協議簡介

oauth協議要解決的問題 如果我們的系統通過使用者的密碼來訪問使用者儲存在第三方系統上的使用者資料的話,對於我們來說是非常有利的,因為我們...

OAuth 2 0 基本介紹

前言 最近討論園子裡是否真末落的話題那可是沸沸揚揚啊!我就不湊這個熱鬧了!在此吐點最近在整的東西出來給大家! 廣大開發者和使用者登入平臺後,...

oAuth2 0及jwt介紹

oauth2 0流程示意如下 關於jwt介紹 說明 關於jwt簡單說明一下,jwt即為json web token,是用來和服務端建立加密通...