OAUTH開放授權

WindrunnerMax發表於2020-05-25

OAUTH開放授權

OAUTH開放授權為使用者資源的授權提供了一個安全的、開放而又簡易的標準。OAUTH的授權不會使第三方觸及到使用者的帳號資訊例如使用者名稱與密碼等,即第三方無需使用使用者的使用者名稱與密碼就可以申請獲得該使用者資源的授權,因此OAUTH授權是安全的,目前OAUTH的版本為2.0

例項

假如此時有一個網站提供照片的沖印服務並且提供郵遞服務,但是使用者的所有照片都儲存在Google網盤中,此使用者如果想沖印大量照片,那麼有以下幾種解決方案:

  • 登入使用者自己的Google賬號,將所有需要列印的照片下載到本地,然後上傳照片到雲沖印網站,交予網站任務讓其幫你沖印。這種解決方案是可行的,但是需要將照片下載後再上傳,比較麻煩。
  • 將自己的Google賬號密碼告知沖印網站,然後沖印網站讀取照片,此後使用者選擇讀取的照片再交予網站進行列印服務。這種解決方案非常不可靠,沖印網站此時能夠接觸到使用者的賬號與密碼,不排除其在後端伺服器儲存賬號密碼的可能。沖印網站只是需要讀取照片資料,而此時沖印網站有了跟使用者一樣的權力,對於Google賬號中儲存的資料全部可以獲取到,擴大了沖印網站的權力。假如所有的需要Google授權的網站都是以告知賬號密碼的形式進行授權,使用者若想收回對於這個網站的授權,只能通過修改密碼的方式,而此時所有的對於其他網站的授權將全部失效。若是授權網站以明文的形式記錄了使用者授權的網站的賬號與密碼,一旦資料庫被攻陷,那麼使用者資訊就將全部洩露。此外不排除網站進行釣魚欺騙使用者賬號密碼的嫌疑,實際上通過贈送物品而騙取使用者賬號密碼是釣魚網站常用的手段。
  • 使用OAUTH開放授權,通過使用者授權照片沖印網站能夠獲得的資料範圍,而對於其他的資料則不給予其訪問許可權,使用者的授權行為全部在Google的授權網站中進行,即使使用者在授權時未登入Google需要賬號密碼登入時也是在Google官方網站進行,沖印網站無法得到使用者賬號與密碼,當使用者在Google授權頁面將讀取照片的許可權給予沖印網站後,沖印網站便可讀取照片資訊然後進行沖印服務。簡單來說OAuth就是一種授權機制,資料的所有者告訴系統,同意授權第三方應用進入系統,獲取這些資料,系統從而產生一個短期的進入令牌token,用來代替密碼,供第三方應用獲取資源使用。

授權過程

名詞定義

  • Third-party application:第三方應用程式,例如上文中的雲沖印網站。
  • HTTP service: 服務提供商,例如上文中的Google
  • User Agent: 使用者代理,一般都是使用瀏覽器。
  • Authorization server: 認證伺服器,服務提供商用來處理認證的伺服器。
  • Resource server: 資源伺服器,即服務提供商存放使用者資源的伺服器。

基本流程

  • 使用者開啟應用程式,應用程式要求使用者給予授權。
  • 使用者在服務提供商網站允許授權,返回應用程式授權資訊。
  • 應用程式使用獲得的授權,向認證伺服器請求令牌Token
  • 認證伺服器對於應用程式的授權碼等資訊進行確認,認證無誤後發放令牌。
  • 應用程式使用令牌向資源伺服器請求資源。
  • 資源伺服器確認令牌無誤後,同意嚮應用程式開放資源。

客戶端授權模式

在基本流程的第二步應用程式需要獲取使用者的授權資訊,進而才能獲取令牌,OAuth 2.0定義了四種授權方式。

授權碼模式

授權碼模式authorization code是功能最完整、流程最嚴密的授權模式,也是最常用的授權模式,它的特點就是通過客戶端的後臺伺服器與服務提供商的認證伺服器進行互動,避免了令牌Token在前端傳輸,前端只傳遞一個授權碼,而授權碼需要結合AppidAppSecret等資訊在後端與認證伺服器交換令牌Token,而AppSecret此類資料需要嚴格保密,所以僅由CODE不能直接獲取到令牌,授權碼模式安全性非常高。

  • 使用者開啟應用程式,點選第三方授權按鈕,此時需要傳遞應用程式的APPID以及授權後跳轉的URL地址,頁面跳轉到授權網站,或者開啟一個新的視窗到授權網站,本例主要是以跳轉到授權網站為例,但基本流程相同。
  • 使用者在授權網站點選授權按鈕,此時瀏覽器跳轉到上一部傳遞的URL地址並且攜帶授權碼CODE資訊,這個授權碼資訊一般有效期比較短,一般為10分鐘。
  • 應用程式收到授權碼,將授權碼CODE傳送到後端,後端根據授權碼CODE以及AppidAppSecret等資訊在後端對認證伺服器發起請求。
  • 認證伺服器檢查請求的資料是否正確,檢查正確後返回令牌Token
  • 應用程式使用令牌向資源伺服器請求資源,資源伺服器確認令牌無誤後,同意嚮應用程式開放資源。

簡化模式

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

  • 使用者開啟應用程式,點選第三方授權按鈕,此時需要傳遞應用程式的APPID以及授權後跳轉的URL地址,頁面跳轉到授權網站,或者開啟一個新的視窗到授權網站,本例主要是以跳轉到授權網站為例,但基本流程相同。
  • 使用者在授權網站點選授權按鈕,此時瀏覽器跳轉到上一部傳遞的URL地址並且攜帶一個HASH資訊,其中包含了令牌。
  • 瀏覽器向資源伺服器發起請求,此時不攜帶上一步請求的HASH資訊,資源伺服器返回一個解析指令碼。
  • 瀏覽器解析上一步獲取的指令碼,然後通過指令碼解析出HASH中的令牌,此時應用程式獲取了令牌。
  • 應用程式使用令牌向資源伺服器請求資源,資源伺服器確認令牌無誤後,同意嚮應用程式開放資源。

密碼模式

密碼模式Resource Owner Password Credentials Grant中,使用者向客戶端提供自己的使用者名稱和密碼,客戶端使用這些資訊,向服務商提供商索要授權。在這種模式中,使用者必須把自己的密碼給客戶端,但是客戶端不得儲存密碼,這通常用在使用者對客戶端高度信任的情況下,比如客戶端是作業系統的一部分,而認證伺服器只有在其他授權模式無法執行的情況下,才能考慮使用這種模式。

  • 使用者嚮應用程式提供使用者名稱與密碼,應用程式使用賬號與密碼發給認證伺服器,請求令牌。
  • 認證伺服器確認資訊無誤後,返回令牌給應用程式。
  • 應用程式使用令牌向資源伺服器請求資源,資源伺服器確認令牌無誤後,同意嚮應用程式開放資源。

客戶端模式

客戶端模式Client Credentials Grant指客戶端以自己的名義,而不是以使用者的名義,向服務提供商進行認證。在這種模式中,使用者直接向客戶端註冊,客戶端以自己的名義要求服務提供商提供服務,嚴格來說這種模式其實並不存在授權問題。

  • 使用者在應用程式中註冊身份,應用程式向認證伺服器進行身份認證並請求令牌。
  • 認證伺服器確認身份無誤後,返回令牌給應用程式。
  • 應用程式使用令牌向資源伺服器請求資源,資源伺服器確認令牌無誤後,同意嚮應用程式開放資源。

每日一題

https://github.com/WindrunnerMax/EveryDay

參考

https://zhuanlan.zhihu.com/p/138424479
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
http://www.ruanyifeng.com/blog/2019/04/oauth_design.html

相關文章