Oauth

 

參考 rfc6749html

1、引文瀏覽器

在咱們平常生活中,應用到受權的地方不少,好比支付寶受權訪問一些我的信息,微信受權訪問一些我的隱私信息,百度雲打印照片,咱們須要向第三方受權訪問咱們的一些隱私信息,傳統的方法就是咱們將本身的用戶名和密碼告訴第三方,這樣的話,第三方應用就能夠登陸讀取咱們的隱私信息了,但這樣作有些問題安全

  1. 第三方應用爲了後續服務,會保存咱們的用戶名及密碼,這樣很不安全
  2. 咱們不能限制第三方應用的權利範圍和有效期
  3. 咱們能夠經過手動將密碼修改收回某個第三方的權利,但這樣會致使以前受權的其餘第三方服務都會失效
  4. 只要一個第三方服務被破解,咱們的用戶名密碼就有泄露的風險
  5. 單純的密碼登錄並不安全,增長難度又會影響第三方服務獲取受權信息的難度

Oauth的出現能夠解決以上問題服務器

2、部分名次解釋微信

(1) third-party application 第三方服務,下文中又稱「客戶端」client,也就是上文說的第三方服務

(2) http service http服務提供商,本文中簡稱「服務提供商」,也就是上文說的支付寶,微信,百度雲

(3) resource owner 資源全部者,下文中又稱「用戶」user

(4) user agent 用戶代理,下文中指瀏覽器

(5) authorization server 受權服務器,即服務提供商專門用來處理受權的服務器

(6) authentication server 認證服務器,即服務提供商專門用來處理認證的服務器(發放令牌)

(7) resource server 資源服務器,即服務提供商存放用戶資源的服務器,它與受權服務器,認證服務器能夠是同一臺服務器,也能夠是不一樣的服務器

3、Oauth思路app

Oauth在客戶端與服務提供商之間,設置了一個受權層(authorization layer),客戶端不能直接登陸服務提供商,只能登陸受權層擁有有限權限。對服務提供商來講,以此能夠分隔開用戶和客戶端,客戶端登陸受權層所使用的令牌(token)與用戶的密碼沒有關係,用戶在登錄的時候,還能夠指定受權層令牌的權限範圍和有效期。客戶端登陸受權層後,服務提供商根據令牌的權限以及有效期向客戶端開放有限用戶資源。框架

4、運行流程url

Oauth2.0的運行流程以下,參考rfc6749 1.2spa

步驟概述操作系統

  • (A)用戶打開客戶端,客戶端要求用戶給予受權
  • (B)用戶贊成給予客戶端受權
  • (C)客戶端使用上一步得到的受權許可,向認證服務器申請令牌
  • (D)認證服務器對客戶端進行認證之後,確認無誤,發放令牌
  • (E)客戶端使用令牌向資源服務器申請獲取資源
  • (F)資源服務器確認令牌,無誤後向客戶端開放資源

 以上6個步驟中,B是關鍵,即用戶如何給予客戶端受權過程,有了這個受權,客戶端就能夠拿到令牌,進而用令牌訪問資源

5、客戶端受權模式

客戶端獲得用戶受權(authorization grant),才能得到令牌(access token),oauth2.0定義了4種受權方式,見rfc6749 1.3.x

  •  受權碼模式(authorization code)
  • 簡化模式(implicit)
  • 密碼模式(resource owner password credentials)
  • 客戶端模式(client credentials)

6、受權碼模式 見rfc6749 4.1

受權碼模式(authorization code)相比其餘模式是功能最完整,流程最嚴密的受權模式 ,它的特色事經過客戶端的後臺服務器與服務提供商的受權服務器進行交互

 

步驟概述

  • (A)用戶訪問客戶端,客戶端將用戶導向受權服務器
  • (B)用戶選擇是否給予客戶端受權
  • (C)假設用戶給予受權,受權服務器將用戶導向客戶端事先指定的重定向url(redirection url),同時附上受權碼
  • (D)客戶端收到受權碼,附上早先的重定向url,向認證服務器申請令牌,這一步是在客戶端後臺服務器完成,對用戶不可見
  • (E)認證服務器覈對受權碼與重定向url,確認無誤,向客戶端發送訪問令牌(access token)和更新令牌(refresh token)

A步驟中,客戶端須要提供如下參數

  • response_type 受權類型,必選項,固定值code
  • client_id 受權服務器標識客戶端的id,這個id是客戶端以前向受權服務器註冊時服務器分發給這個客戶端的,id是惟一的,必選項
  • redirect_uri 受權服務器重定向的url,可選項
  • scope 申請的權限範圍,可選項
  • state 傳到受權服務器,受權服務器重定向到客戶端的時候會將該參數原封不動傳回來,推薦選項,可用來防止csrf(cross-site request forgery跨站請求僞造)

好比

C步驟中,服務器重定向到客戶端,包含如下參數

  • code 受權碼,該碼的有效期應該短一些,推薦設置10分鐘,客戶端只能使用一次,若是認證服務器發現該碼被使用不止一次,應該撤銷以前和這個碼相關的令牌或服務
  • state 以前客戶端請求受權中包含這個參數,會原封不動傳回來

好比

D步驟中,客戶端向認證服務器申請令牌,包含如下參數

  • grant_type 受權模式,必選項,固定值authorization_code
  • code 受權碼,必選項,以前從受權服務器拿到的受權碼
  • redirect_uri 重定向url,必選項,必須與步驟A中的該參數值相同
  • client_id 客戶端id,必選項

好比

E步驟中,認證服務器若是認證經過,http返回中包含如下參數

  •  access_token 訪問令牌,必選項
  • token_type 令牌類型,必選項
  • expires_in 過時時間,單位爲秒
  • refresh_token 更新令牌,用來獲取下一次的訪問令牌 

好比

在用戶向認證服務器申請令牌的時候,認證服務器經過client_id,client_secret(客戶端註冊的時候被分配的)判別客戶端的真實性

7、簡化模式 見rfc6749 4.2

 簡化模式(implicit)不經過第三方應用程序的服務器,直接在瀏覽器中向認證服務器申請令牌,調過受權碼這個步驟。全部步驟在瀏覽器中完成,令牌對訪問者可見,且客戶端不須要認證

步驟以下

  • (A)客戶端將用戶導向認證服務器
  • (B)用戶決定是否給予客戶端受權
  • (C)用戶給予受權,認證服務器講用戶導向客戶端指定的重定向url,並在url的fragment(段)部分包含訪問令牌
  • (D)瀏覽器向資源服務器發出請求,請求中不包含上一步收到的fragment
  • (E)資源服務器返回一個網頁,網頁中包含能夠從fragment中提取訪問令牌的腳本
  • (F)瀏覽器執行上一步得到的腳本,提取出令牌
  • (G)瀏覽器將令牌交給客戶端

A步驟中,客戶端發出的http請求包含如下參數

  • response_type 受權類型,必選項,固定值token
  • client_id 客戶端id,必選項
  • redirect_uri 重定向url,可選項
  • scope 權限範圍,可選項
  • state 同受權碼模式A步驟

好比

C步驟中,認證服務器重定向客戶端,包含如下參數

  • access_token 訪問令牌
  • token_type 令牌類型
  • expires_in 過時時間,單位秒
  • scope 權限範圍
  • state 同受權碼模式步驟E

好比

8、密碼模式 見rfc6749 4.3

密碼模式(resource owner password credentials grant)中,用戶向客戶端提供本身的用戶名和密碼,客戶端使用這些信息,向服務商提供商索要受權。在這種狀況下,用戶必須把本身的密碼給到客戶端,但客戶端不得存儲密碼,這一般創建在用戶對客戶端高度信任的基礎上,好比客戶端是操做系統的一部分或者是權威公司的產品,認證服務器只有在其餘模式不可行的狀況下,才考慮這個模式

步驟以下

  • (A)用戶向客戶端提供用戶名和密碼
  • (B)客戶端將用戶名和密碼發到認證服務器,請求令牌
  • (C)認證服務器確認無誤後,向客戶端提供訪問令牌

B步驟中,客戶端發出http請求,包含如下參數

  • grant_type 受權類型,必選項,固定值password
  • username 用戶名,必選項
  • password 用戶密碼,必選項
  • scope 權限範圍,可選項

好比

C步驟中,認證服務器向客戶端發送訪問令牌,例子以下

整個過程,客戶端不容許保存用戶密碼

9、客戶端模式 見rfc6749 4.4

客戶端模式(client credentials grant)指客戶端以本身的名義向服務提供商進行認證,嚴格意義上,這不屬於oauth框架索要解決的問題,在這種模式下,用戶直接向客戶端註冊,客戶端以本身的名義要求服務提供商提供服務,其實不存在受權問題

步驟以下

  • (A)客戶端向認證服務器進行身份認證,請求一個令牌
  • (B)認證服務器確認無誤後,向客戶端提供訪問令牌

A步驟中,客戶端發出http請求,包含如下參數

  • grant_type 受權類型,必選項,固定值client_credentials
  • scope 權限範圍,可選項

以下

認證服務器必須以某種方式,驗證客戶端身份

B步驟中,認證服務器向客戶端發送訪問令牌,例子以下

10、更新令牌 見rfc6749 6

若是用戶訪問的時候,客戶端令牌已過時,則須要使用更新令牌申請一個新的訪問令牌

客戶端發出更新訪問令牌的請求,參數以下

  • grant_type 受權模式,必選項,固定值refresh_token
  • refresh_token 早前收到的更新令牌,必選項
  • scope 申請受權範圍,不能夠超出上一次申請的範圍,若是省略,則與上一次一致

以下

以上內容根據翻譯文檔以及rfc原文綜合記錄

相關文章
相關標籤/搜索