詳解Oauth2.0的實現原理,手動搭建自己的Oauth服務

大家好,我是阿邁達,有趣的互聯網軟件工程師。專業角度分析技術原理,幽默的態度解讀科技互聯網資訊。



前言

Oauth是目前認證用的最多的一種方式,如果一個網站支持用別的平臺用戶信息登錄,這中間基本都是基於Oauth實現的。Oauth的實現原理到底是怎樣的?有哪幾種認證方式呢?本文就將針對這些問題進行講解,讀完本文,相信你會對Oauth有一個完整的認識,也可以動手自己實現一個Oauth。


Oauth是什麼

OAuth是用於授權的行業標準協議。OAuth致力於簡化客戶端開發人員的工作,同時為Web應用程序,桌面應用程序,移動電話和客廳設備提供特定的授權流程。Oauth發展經過了Oauth1.0和Oauth2.0的時代,Oauth1.0和Oauth2.0互相不兼容,目前廣泛使用的是Oauth2.0。

OAuth在客戶端與服務提供商之間設置了中間層:授權層。客戶端不能直接登錄服務提供商,只能登錄授權層,以此將用戶與客戶端區分開來。客戶端登錄授權層所用的令牌(token),與用戶的密碼不同。用戶可以在登錄的時候,指定授權層令牌的權限範圍和有效期。客戶端登錄授權層以後,服務提供商根據令牌的權限範圍和有效期,向客戶端開放用戶儲存的資料。


詳解Oauth2.0的實現原理,手動搭建自己的Oauth服務


OAuth的客戶端獲取用戶信息是基於用戶授權的,也就是說客戶端要獲取用戶在某個平臺(服務提供商)的信息,事先要經過用戶的授權,Oauth的運行流程如下所示:


詳解Oauth2.0的實現原理,手動搭建自己的Oauth服務

客戶端首先向用戶發起授權請求,用戶選擇需要授權給客戶端的資源,同意授權登陸客戶端。客戶端拿到授權信息以後,向授權服務器申請AccessToken,獲取到AccessToken以後,客戶端就可以訪問用戶授權範圍內的信息了。而在用戶授權的這一操作中,Oauth提供了四種授權的方式,分別為:授權碼模式、簡化模式、密碼模式、客戶端模式。


授權碼模式是最常用的一種授權模式。客戶端和授權服務直接通過授權碼來進行交互,Access_Token通過授權碼獲取。授權碼流程如下:


詳解Oauth2.0的實現原理,手動搭建自己的Oauth服務


  • 1、客戶端攜帶client_id請求授權服務器獲取授權碼,跳轉到用戶授權登錄頁。
  • 2、用戶確認授權,授權服務器生成授權碼,攜帶授權碼302重定向到客戶端的回調地址上。
  • 3、客戶端獲取到授權碼以後,請求授權服務器獲取Access_Token。
  • 4、授權服務器返回Access_Token和Refresh_Token。
  • 5、客戶端使用Access_Token訪問用戶授權的資源。

授權碼模式可以獲取到Refresh_Token,Refresh_Token可以用來刷新Access_Token的有效期,所以適合有服務端的應用程序,服務端可以保存Access_Token,不用頻繁獲取Access_Token。


簡化模式

簡化模式省去了獲取授權碼的步驟,客戶端攜帶client_id直接向授權服務器獲取Access_Token。授權碼流程如下:


詳解Oauth2.0的實現原理,手動搭建自己的Oauth服務


  • 1、客戶端攜帶client_id請求授權服務器獲取Access_Token,跳轉到用戶授權登錄頁。
  • 2、用戶確認授權,授權服務器生成Access_Token,攜帶Access_Token 302重定向到客戶端的回調地址上。
  • 3、客戶端使用Access_Token訪問用戶授權的資源。

簡化模式在客戶端直接就可以 直接完成,適合於沒有服務端的app。


密碼模式

密碼模式是基於用戶名密碼的授權模式,用戶通過在客戶端輸入用戶名密碼,客戶端攜帶用戶名密碼向授權服務器獲取Access_Token,授權流程如下:


詳解Oauth2.0的實現原理,手動搭建自己的Oauth服務

  • 1、用戶打開客戶端的登錄頁面,輸入自己的賬號密碼。
  • 2、客戶端攜帶用戶名密碼(原則上客戶端不允許保存用戶的賬號信息)向授權服務器獲取Access_Token。
  • 3、客戶端使用Access_Token訪問用戶授權的資源。

密碼模式是一種不安全的授權的方式,用戶的密碼暴露給了客戶端,這種模式是用戶在完全信任客戶端模式的情況下完成的。


客戶端模式


客戶端模式是客戶端直接向授權服務器獲取資源信息。授權流程如下:

詳解Oauth2.0的實現原理,手動搭建自己的Oauth服務

這種授權模式嚴格來說不屬於Oauth範疇,因為整個授權過程中不涉及用戶授權的操作,客戶端直接向授權服務器獲取資源信息。



Oauth流程分析


目前很多平臺都提供了基於Oauth的授權服務,例如:QQ、微博、Google、Github等平臺。網站可以接入這些平臺的授權API,用戶可以使用自己在這些平臺的賬號來授權登陸網站,我們以CSDN網站來舉例說明:

打開CSDN的登陸首頁,我們可以看到它支持用戶使用QQ、微博、百度、脈脈等賬號登陸,這些登陸方式都是基於Oauth認證方式。

詳解Oauth2.0的實現原理,手動搭建自己的Oauth服務

這裡我們選擇使用微博授權登陸,點擊微博授權登陸以後,系統會跳轉到微博授權登陸頁面,如下圖所示:

詳解Oauth2.0的實現原理,手動搭建自己的Oauth服務

觀察瀏覽器的地址,我們發現是微博提供的Oauth認證API。


詳解Oauth2.0的實現原理,手動搭建自己的Oauth服務


因為是從CSDN登陸也跳轉到了微博的登陸頁面,所以用戶可以很放心的輸入自己的用戶名密碼,所以這就是Oauth的魅力所在,用戶並不直接向CSDN提供自己微博的用戶名密碼,所以是一種安全的授權模式。用戶在微博登陸自己的賬號以後,跳轉到授權頁面,如下圖所示:


詳解Oauth2.0的實現原理,手動搭建自己的Oauth服務


授權頁面顯示了用戶將要授權哪些信息給CSDN,這裡包括用戶的個人信息(暱稱、頭像等基礎信息)、分享內容到微博、獲取評論信息等數據。授權成功以後,CSDN服務端就可以通過微博提供的API獲取當前用戶的以上信息。


以上就是整個Oauth的認證流程,如果我們是一個授權服務商,我們支持其它客戶端通過我們應用的用戶直接登錄,我們需要按照以上流程提供授權服務,主要包括:

  • 1、客戶端註冊功能。需要接入的客戶端首先需要在平臺註冊,平臺生成client_id。
  • 2、生成授權碼服務。客戶端第一步發去授權的時候需要獲取授權碼,平臺生成授權碼以後302重定向到客戶端,並返回授權碼。
  • 3、生成Access_Token服務。
  • 4、刷新Access_Token服務。

按照以上的流程開發,就可以實現自己的授權服務。


最後

Oauth是開放的授權協議,基於Oauth我們可以很容易實現自己的授權服務,這也是目前各大開放平臺的基礎服務功能。通過Oauth授權,可以打通第三方應用和平臺的數據互通、資源共享。而對於用戶來說,不用頻繁的註冊各類賬號,通過一個賬號就可以登錄各種客戶端APP和網站,就如現在大多數網站都支持用微信掃碼直接登錄,這是互聯網技術的一大進步。


分享到:


相關文章: