天天看點

【OAuth2】授權機制

OAuth2.0是一種主流的授權機制,主要用來頒發令牌(token)。

OAuth 的核心就是向第三方應用頒發令牌

令牌(token)與密碼(password)

同:作用是一樣,都可以進入系統。

異:

  • 令牌是短期的,到期會自動失效,使用者自己無法修改。密碼一般長期有效,使用者不修改,就不會發生變化。
  • 令牌可以被資料所有者撤銷,會立即失效。密碼一般不允許被他人撤銷。
  • 令牌有權限範圍(scope)。密碼一般是完整權限。

運作流程

運作流程(标準 RFC 6749)

【OAuth2】授權機制

釋義:

  • Client

    :用戶端,第三方應用,可以是浏覽器、APP,也可以是内部服務
  • Resource Owner

    :資源擁有者,最終使用者,他有通路資源的賬号與密碼,可以簡單把資源擁有者了解成人,他在使用用戶端通路資源
  • Authorization Server

    :認證(授權)伺服器,用于認證使用者,如果用戶端認證通過,則發放給其通路資源伺服器的令牌
  • Resource Server

    :資源伺服器,擁有受保護資源,如果請求包含正确的通路令牌,則可以通路資源,比如給用戶端提供 API 服務
  • Access Token

    :令牌,用于擷取資源

流程

(A)使用者(Resource Owner)打開用戶端以後,用戶端(Client)要求使用者給予授權

(B)使用者同意給予用戶端授權

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

(D)認證伺服器對用戶端進行認證以後,确認無誤,同意發放令牌(Access Token)

(E)用戶端使用令牌,向資源伺服器申請擷取資源

(F)資源伺服器确認令牌無誤,傳回被保護的資源資訊

上述步驟中,(B)是關鍵,即使用者怎樣才能給于用戶端授權,oauth2有四種授權方式:

  • 授權碼(authorization-code):功能最完整、流程最嚴密的授權模式,适用于那些有後端的 web應用。授權碼通過應用傳送,令牌則是儲存在後端,而且所有與資源伺服器的通信都在後端完成。這樣的前後端分離,可以避免令牌洩漏。目前主流的第三方認證。
  • 簡化模式,隐藏式(implicit):有些web 應用是純前端應用,沒有後端,必須将令牌儲存在前端。沒有授權碼這個中間步驟,直接向前端頒發令牌。純前端應用的第三方認證。
  • 密碼模式(password):高度信任用戶端,使用者把使用者名和密碼直接告訴該用戶端,該用戶端通過使用者的密碼申請令牌。适用于公司自身搭建(非第三方的)的認證伺服器。
  • 用戶端模式,憑證式(client credentials):不需要使用者授權,嚴格說不屬于OAuth架構所要解決的問題,用戶端以自己的名義申請令牌。适用于不需要使用者參與的完全信任的服務端。

授權碼、簡化模式需要從用戶端跳轉到認證伺服器讓使用者授權,再跳轉回用戶端

密碼模式和用戶端模式不需要跳轉

授權碼模式需要通過跳轉擷取授權碼,再通過授權碼擷取令牌

簡化模式通過跳轉直接擷取到令牌

密碼模式不需要跳轉,通過賬密直接擷取令牌

不管哪一種授權方式,第三方應用在申請令牌之前,都必須将自己的身份識别碼備案在認證伺服器:用戶端 ID(client ID)和用戶端密鑰(client secret)。這是為了防止令牌被濫用,沒有自身識别碼的第三方應用,是不會拿到令牌的。

授權碼模式

第三方應用先申請一個授權碼,然後再用該碼擷取令牌。

(A)請求授權碼:A 網站(第三方應用)提供一個連結,要求使用者跳轉到 B 網站(認證伺服器)。

https://b.com/oauth/authorize?
  response_type=code&
  client_id=CLIENT_ID&
  redirect_uri=CALLBACK_URL&
  scope=read
           

response_type:表示要求傳回授權碼(code)

client_id:讓 B 知道是誰在請求

redirect_uri:B 接受或拒絕請求後的跳轉網址

scope:表示要求的授權範圍(這裡是隻讀)

(B)傳回授權碼:使用者跳轉後,B 網站會要求使用者登入,然後詢問是否同意給予 A 網站授權。使用者表示同意,這時 B 網站就會跳回redirect_uri參數指定的網址。跳轉時,會攜帶一個授權碼。

https://a.com/callback?code=AUTHORIZATION_CODE

(C)請求令牌:A 網站拿到授權碼以後,A網站的後端向 B 網站請求令牌。

https://b.com/oauth/token?
 client_id=CLIENT_ID&
 client_secret=CLIENT_SECRET&
 grant_type=authorization_code&
 code=AUTHORIZATION_CODE&
 redirect_uri=CALLBACK_URL
           

client_id、client_secret:用來讓 B 确認 A 的身份(client_secret參數是保密的,是以隻能在後端發請求),

grant_type:AUTHORIZATION_CODE表示采用的授權方式是授權碼,

code:上一步拿到的授權碼

redirect_uri:令牌頒發後的回調網址。

(D)傳回令牌:B 網站收到請求以後,就會傳回令牌。

簡化模式

不通過第三方應用程式的伺服器,直接在浏覽器中向認證伺服器申請令牌,跳過了"授權碼"這個步驟

(A)A 網站提供一個連結,要求使用者跳轉到 B 網站。

https://b.com/oauth/authorize?
  response_type=token&
  client_id=CLIENT_ID&
  redirect_uri=CALLBACK_URL&
  scope=read
           

(BCD)使用者跳轉到 B 網站,登入後同意給予 A 網站授權。B 網站就會跳回redirect_uri參數指定的跳轉網址,并且把令牌作為 URL 參數,傳給 A 網站。此時A網站拿到令牌。

https://a.com/callback#token=ACCESS_TOKEN

密碼模式

使用者向用戶端提供自己的使用者名和密碼。用戶端使用這些資訊,向授權伺服器索要授權。

(ABC)A 網站要求使用者提供 B 網站的使用者名和密碼。拿到以後,A 就直接向 B 請求令牌。

https://oauth.b.com/token?
  grant_type=password&
  username=USERNAME&
  password=PASSWORD&
  client_id=CLIENT_ID&
  client_secret=CLIENT_SECRET
           

(D)B 網站驗證身份通過後,直接給出令牌。此時不需要跳轉,A 通過http

響應結果直接拿到令牌。

用戶端模式

用戶端以自己的名義,而不是以使用者的名義,向授權伺服器索要授權

(C)A 應用向 B 送出請求。

https://oauth.b.com/token?
  grant_type=client_credentials&
  client_id=CLIENT_ID&
  client_secret=CLIENT_SECRET
           

(D)B 網站驗證通過以後,直接傳回令牌。

繼續閱讀