天天看點

深入了解OAuth2協定和使用場景

OAuth2協定概述

生活中,當我們使用滴滴出行或者美團app進行登入時,如果選擇微信授權登入,則可以使用微信的頭像,昵稱,地區和性别資訊登入,如圖:

深入了解OAuth2協定和使用場景
深入了解OAuth2協定和使用場景

在滴滴出行和美團app的系統中,是沒有存儲微信的使用者資訊,但是授權過後就可以使用到微信的部分權限。這操作過程就是基于OAuth2協定實作的。OAuth2是目前授權的行業标準,OAuth2中有4種角色

  • Resource Owner,資源所有者,對受保護的資源擁有通路權限的實體,通常是指一個使用者。
  • Resource Server,資源伺服器,擁有受保護的資源,允許持有通路令牌(access token)通路資源。
  • Client,用戶端,通常是指第三方應用程式。
  • Authorization Server,授權伺服器,對使用者認證,認證通過後向用戶端發送通路令牌(access token)

在上面的例子中,微信使用者是資源所有者;微信的頭像,昵稱,地區和性别資訊登入API就是資源伺服器;滴滴出行或者美團app是用戶端,第三方應用程式;授權伺服器是微信開放平台提供,例子中未展現。詳細的OAuth2概念可以參考(轉阮一峰)深入了解OAuth 2.0。一般用戶端直接通路通路資源服務時,會抛出沒有權限的錯誤,需要用戶端經常授權伺服器的認證,拿到通路令牌以後,才能成功的通路。OAuth2主要包含如下步驟:

  1. 用戶端請求資源所有者的授權。
  2. 資源所有者同意授權,傳回授權憑證(Authorizaiton Grant)。
  3. 用戶端攜帶授權憑證,向授權伺服器請求通路令牌(access token)。
  4. 授權伺服器對用戶端進行身份認證,認證授權,認證通過則傳回通路令牌(access token)。
  5. 用戶端攜帶通路令牌,請求資源伺服器。
  6. 資源伺服器驗證通路令牌,有效則傳回資源。
  7. 如果通路令牌失效(access token),用戶端使用重新整理令牌(refresh token)再次請求通路令牌。

OAuth2預設定義了4種授權類型,分别如下:

  • Authorization Code:授權碼類型
  • Implicit:簡化類型,也稱為隐式類型
  • Resource Owner Password Credentials:密碼類型
  • Client Credential:用戶端類型

OAuth2使用場景

在實際開發中,主要是授權碼類型和密碼類型。

密碼模式

是用戶端向授權伺服器擷取通路令牌時,直接帶上用戶端資訊和使用者資訊,認證通過後就直接傳回通路令牌。通常,密碼類型一般适用于公司内部服務的互相通路,知道資源所有者的認證資訊。例如,公司的管理後端,需要通路自己的訂單服務,商品服務,使用者服務等等,這些都是公司内部服務,在授權時,直接帶上管理後端的使用者資訊也無妨。

授權碼類型

是功能最完整,流程最嚴密的授權類型。通常,用戶端通路資源服務伺服器進行認證時,用戶端不儲存使用者的姓名和密碼資訊,在進行認證時,一般在浏覽器輸入使用者姓名和密碼框進行使用者授權,成功後通路一個授權碼。用戶端再次帶上授權碼通路授權伺服器,認證通過就可以得到通路令牌。微信開發平台中的微信登入功能就是基于授權碼類型實作的,具體可以參考微信官方文檔-開放平台。以下,以微信開放平台和擷取微信使用者基本開放資訊講解OAuth2協定和授權碼類型的流程。

在進行微信 OAuth2.0 授權登入接入之前,在微信開放平台注冊開發者帳号,并擁有一個已稽核通過的移動應用(OAuth2的用戶端),并獲得相應的 AppID 和 AppSecret,申請微信登入且通過稽核後,可開始接入流程。微信 OAuth2.0 授權登入讓微信使用者(資源所有者)使用微信身份安全登入第三方應用或網站(用戶端),在微信使用者授權登入已接入微信 OAuth2.0 的第三方應用後,第三方可以擷取到使用者的接口通路令牌(access_token),通過 access_token 可以進行微信開放平台授權關系接口(資源伺服器)調用,進而可實作擷取微信使用者基本開放資訊和幫助使用者實作基礎開放功能等。授權碼類型整體流程為:

  1. 第三方發起微信授權登入請求,微信使用者允許授權第三方應用後,微信會拉起應用或重定向到第三方網站,并且帶上授權臨時票據code參數。
  2. 通過code參數加上AppID和AppSecret等,通過API換取access_token。
  3.  通過access_token進行接口調用,擷取使用者基本資料資源或幫助使用者實作基本操作。

在微信開發平台在中 ,通路令牌access_token 有效期為 2 個小時,當 access_token 逾時後,可以使用重新整理令牌refresh_token進行重新整理,refresh_token的有效期為30 天;當 refresh_token 失效的後,需要使用者重新授權再次擷取access_token。使用者擷取access_token的時序圖如下:

深入了解OAuth2協定和使用場景

繼續閱讀