最開始接觸 OAuth2.0 的時候,經(jīng)常將它和 SSO單點登錄搞混。后來因為工作需要,在項目中實現(xiàn)了一套SSO,通過對SSO的逐漸了解,也把它和OAuth2.0區(qū)分開了。所以當時自己也整理了一篇文章 SSO單點登錄三種情況的實現(xiàn)方式詳解_跡憶客 有興趣的小伙伴可以看一下
最近需要經(jīng)常和各大電商平臺進行對接,所以又和OAuth2.0重逢了。因此這里再次對OAuth2.0的原理及實現(xiàn)方式進行一個梳理,希望通過這套教程能夠幫到大家。對于技術(shù)類的文章,這引言是有點過長了。好了下面我們進入正題。
什么是 OAuth2.0
OAuth 是一種開放的授權(quán)協(xié)議,它是目前最流行的授權(quán)機制。它允許將存儲在一個站點上的資源共享到另一個站點,而無需使用該站點的憑據(jù)。
這類定義一般都比較抽象,要理解起來不是太容易。所以這里我們通過一個實際應用的類比來說明一下這個場景,你會發(fā)現(xiàn),其實OAuth2.0的原理并不復雜。
首先,假設(shè)我在微信上注冊了賬號,然后加了一些好友,并且有一些聊天記錄。
然后,我正在訪問一個網(wǎng)站/應用。這里假設(shè)正在訪問 www.jiyik.com 。這個網(wǎng)站有一項功能是可以獲取微信號上的好友和聊天,然后對這些信息進行一個統(tǒng)計分析的功能(當然,本站是沒有這項功能的)。
個人感覺這項功能不錯,就想使用它。有一種方式是我可以把個人的微信賬號和密碼告訴這個應用。應用可以通過賬號密碼獲取到好友信息和聊天記錄。但是這樣我感覺很不安全,如果我以后不想再繼續(xù)使用了,那我還得再去修改賬號和密碼。那樣就會很麻煩了。所以這里就需要一種方式可以使得我將一些權(quán)限授權(quán)給該網(wǎng)站,使其可以不用賬號和密碼就可以獲取到這些信息。 這種授權(quán)方式就是 OAuth2.0。當我不再想使用該功能的時候,我就可以把權(quán)限收回或者使授權(quán)失效。
所以說一個完整的OAuth2.0 的流程需要涉及到三個實體。

OAuth2.0原理示例
- 資源服務(wù)商 (微信,google,F(xiàn)acebook等)
- 第三方網(wǎng)站/應用
- 用戶
當有另一個第三方的網(wǎng)站要使用微信賬號登錄其系統(tǒng)時,同樣我們也可以通過授權(quán)的方式登錄這個第三方的網(wǎng)站。這樣就實現(xiàn)了同一個微信賬號可以多個不同的網(wǎng)站進行登錄。這也是一種單點登錄,這也是為什么最初經(jīng)常會將其和SSO單點登錄搞混的原因。
通過上面的場景,我們大概也能清楚OAuth2.0的基本的原理了。下面我們通過整體介紹一下其架構(gòu),來更深入的了解其工作原理。
OAuth2.0 架構(gòu)

OAuth2.0-認證架構(gòu)
整個的流程是這樣的。
一、 首先,用戶使用 Google、微信 等第三方應用程序訪問資源。
二、 第三方網(wǎng)站會帶著客戶端ID和客戶端密鑰重定向到資源服務(wù)的授權(quán)登錄界面。
三、 用戶會接收到一個Google或微信的授權(quán)登錄界面。用戶需要在該界面進行授權(quán)。
四、 用戶使用身份驗證應用程序登錄。客戶端 ID 和客戶端密鑰對于授權(quán)服務(wù)器上的客戶端應用程序是唯一的。
五、 身份驗證服務(wù)器使用授權(quán)代碼將用戶重定向到重定向統(tǒng)一資源標識符 (URI)。這個地址是第三方網(wǎng)站在接入資源服務(wù)的認證服務(wù)時提交給認證服務(wù)的,當用戶授權(quán)成功后,會被重定向到該網(wǎng)址。
六、 用戶訪問位于客戶端應用程序中重定向 URI 的頁面,該頁面此時會帶有一個用于驗證的Code。
七、 客戶端應用程序?qū)@得身份驗證Code、客戶端 ID 和客戶端密鑰,并將它們發(fā)送到授權(quán)服務(wù)器。
八、 身份驗證應用程序向客戶端應用程序返回訪問令牌。
九、 一旦客戶端應用程序獲得訪問令牌,用戶開始使用客戶端應用程序訪問資源所有者的資源。
整個OAuth2.0的流程就是這樣的。這其中會涉及到一些HTTP的知識點,關(guān)于HTTP可以參考我們的 HTTP教程。
OAuth2.0會涉及到很多術(shù)語和概念,下面我們對這些術(shù)語概念進行一些解釋。
術(shù)語
驗證
身份驗證是識別一個用戶的過程,通常是基于用戶個人的用戶名和密碼。通過用戶名和密碼來驗證該用戶是否是一個合法的資源持有者。
聯(lián)合身份驗證
許多第三方網(wǎng)站/應用都有自己的用戶名和密碼。某些應用程序依賴于其他服務(wù)來驗證用戶的身份。聯(lián)合身份管理系統(tǒng)提供對多個系統(tǒng)的單一訪問。這稱為聯(lián)合身份驗證。
授權(quán)
授權(quán)是允許某人做某事的過程。它需要有效用戶的身份來檢查該用戶是否被授權(quán)。
委托授權(quán)
委托授權(quán)是將自己的憑據(jù)提供給其他用戶以代表該用戶執(zhí)行某些操作的過程。
角色
OAuth 定義了以下角色

OAuth2.0 角色
- 資源所有者 - 資源所有者被定義為能夠授予訪問其在資源服務(wù)器上托管的自己數(shù)據(jù)的能力的實體。當資源所有者是個人時,稱為最終用戶。
- 客戶端應用程序 - 客戶端是一個應用程序,它發(fā)出受保護的資源請求以代表資源所有者執(zhí)行操作。
- 資源服務(wù)器 - 資源服務(wù)器是可用于訪問用戶信息的 API 服務(wù)器。
- 認證服務(wù)器 - 認證服務(wù)器從資源所有者那里獲得許可并將訪問令牌分發(fā)給客戶端,以訪問由資源服務(wù)器托管的受保護資源。
Web 服務(wù)器
Web 服務(wù)器是一個計算機系統(tǒng),它使用 HTTP協(xié)議 將網(wǎng)頁傳送給用戶。只要應用程序想要訪問資源服務(wù)器,客戶端ID和密鑰就存儲在web應用程序服務(wù)器上。將客戶端ID和密鑰存儲在 Web 應用程序服務(wù)器上的目的是保密。

客戶端 Web 應用程序服務(wù)器
在上圖中,資源所有者允許機密客戶端訪問托管在資源服務(wù)器上的數(shù)據(jù),其中客戶端 ID 和密鑰保存在服務(wù)器上并且是保密的。
客戶端 ID 和密鑰對于授權(quán)服務(wù)器上的客戶端應用程序是唯一的。
資源服務(wù)器是一個服務(wù)器,它承載著 Google、微信等資源。這些資源存儲在資源服務(wù)器上,供客戶端應用程序訪問,資源所有者擁有這些資源。
然后,授權(quán)服務(wù)器使用客戶端 Web 應用程序訪問資源所有者的資源。
用戶代理
用戶代理應用程序由用戶設(shè)備中的客戶端應用程序使用,它可以是一個腳本語言,例如在瀏覽器中運行的 JAVAScript。所以說我們可以將用戶代理應用程序存儲在 Web 服務(wù)器上。
下圖顯示了客戶端用戶代理應用程序的架構(gòu)。

OAuth2.0 客戶端用戶代理應用程序的架構(gòu)
一、 首先,用戶使用 Google、微信 等身份驗證應用程序訪問資源所有者的資源。
二、 接下來,用戶應用程序提供客戶端 ID 和客戶端密鑰,從而登錄到授權(quán)服務(wù)器。
三、 然后,用戶代理應用程序提供一個在瀏覽器中運行的 JavaScript 應用程序?qū)嵗㈡溄拥?Web 服務(wù)器。
四、 授權(quán)服務(wù)器允許使用客戶端憑據(jù)從資源服務(wù)器訪問資源。
五、 資源服務(wù)器包含由資源所有者擁有的資源。
本機應用程序
本機應用程序可以用作桌面或手機應用程序的實例,它使用資源所有者憑據(jù)。它是安裝在資源所有者設(shè)備上的客戶端應用程序。
應用程序使用的身份驗證憑據(jù)包含在應用程序代碼中。因此,不要使用在外部用戶代理中運行的本機應用程序。

OAuth2.0 客戶端本機應用程序的架構(gòu)
一、 首先,用戶使用 Google、微信 等身份驗證應用程序訪問資源所有者的資源。
二、 接下來,本機應用程序使用客戶端 ID 和客戶端密鑰登錄到授權(quán)服務(wù)器。本機應用程序是桌面或手機應用程序的實例,它安裝在用戶計算機上,并將客戶端密鑰存儲在計算機或設(shè)備上。
三、 授權(quán)服務(wù)器允許使用客戶端憑據(jù)從資源服務(wù)器訪問資源。
四、 資源服務(wù)器包含由資源所有者擁有的資源。
總結(jié)
以上我們介紹了OAuth2.0 的整體流程,以及這中間涉及到的一些術(shù)語和概念我們分別進行了介紹。這要求我們對HTTP協(xié)議的原理要稍微有些了解。通過上面的介紹其實我們可以看到,整個過程較為核心的部分就是對 訪問令牌的獲取。可以查看OAuth2.0 - 頒發(fā)訪問令牌的幾種方式 來了解如何獲取訪問令牌。