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

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

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

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

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

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

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