OAuth 2.0只是授權(quán)協(xié)議,OIDC才是認(rèn)證授權(quán)協(xié)議
上一文我們對(duì)Keycloak保護(hù)Spring Boot應(yīng)用進(jìn)行了實(shí)操。讓大家見(jiàn)識(shí)到了Keycloak的強(qiáng)大。為了掌握Keycloak就必須對(duì)OpenID Connect(OIDC)協(xié)議進(jìn)行了解。OIDC是OAuth 2.0的一個(gè)擴(kuò)展協(xié)議。它為什么要擴(kuò)展OAuth 2.0?在搞清楚這個(gè)問(wèn)題之前我們需要再回顧一下OAuth 2.0協(xié)議。
OAuth 2.0
以往胖哥也說(shuō)了不少OAuth 2.0協(xié)議相關(guān)的東西,但是依然讓大家云里霧里。所以今天我們換一個(gè)角度來(lái)說(shuō)一說(shuō)OAuth 2.0。如今利用這個(gè)協(xié)議搞開(kāi)放API的越來(lái)越多了。
為什么要開(kāi)放授權(quán)
假如我開(kāi)發(fā)了一個(gè)互聯(lián)網(wǎng)照片存儲(chǔ)服務(wù),這里叫它XX相冊(cè)存儲(chǔ)服務(wù),經(jīng)過(guò)精心的運(yùn)營(yíng)用戶量達(dá)到了一定的規(guī)模,這個(gè)時(shí)候往往會(huì)進(jìn)入一個(gè)瓶頸期,我希望進(jìn)一步提升這個(gè)品牌的知名度以改變這種現(xiàn)狀。而另一個(gè)第三方照片打印平臺(tái)也看中了我的獨(dú)特優(yōu)勢(shì),希望我能開(kāi)放一些功能出來(lái)給他們調(diào)用。
強(qiáng)強(qiáng)聯(lián)合,做大做強(qiáng)!我覺(jué)得這是一個(gè)好主意,它用了我的開(kāi)放服務(wù)后也可以幫我引流用戶、擴(kuò)大我的影響力。從用戶角度來(lái)看,可以同時(shí)享受照片云儲(chǔ)存、云打印服務(wù)是非常具有吸引力的。所以開(kāi)放一些功能給第三方是非常劃算的。
客戶端授權(quán)接入
雖然開(kāi)放授權(quán)的好處很多,但是也不能沒(méi)有規(guī)則。用戶的隱私保護(hù)、數(shù)據(jù)安全都是非常重要的。經(jīng)過(guò)仔細(xì)斟酌,我確定了下面幾條開(kāi)放的原則:
- 第三方需要在我的平臺(tái)開(kāi)個(gè)戶,這樣方便我對(duì)第三方平臺(tái)進(jìn)行管理和審計(jì)。哪個(gè)第三方不合規(guī)我就限流甚至封停其資格。
- 明確開(kāi)放的接口類目并對(duì)其進(jìn)行權(quán)限分類。用來(lái)滿足不同層次的第三方。有的第三方只能獲取用戶信息;有的第三方可以調(diào)用云打印。方便后續(xù)收費(fèi)恰飯。
- 調(diào)用這些服務(wù)必須征求照片的實(shí)際擁有者(資源擁有者)同意,這是一個(gè)法律問(wèn)題。獲取用戶的信息和資源必須征得用戶同意才行。
于是第三方打印平臺(tái)按照我制定的規(guī)則提請(qǐng)了一個(gè)接入申請(qǐng),審核通過(guò)后我給他發(fā)了一套客戶端憑證,包含了clientId和對(duì)應(yīng)的secret,并明確告知第三方可以申請(qǐng)哪些功能,然后第三方就可以根據(jù)API文檔進(jìn)行開(kāi)發(fā)了。
授權(quán)流程
用戶登錄了照片打印平臺(tái),發(fā)現(xiàn)居然還提供從XX相冊(cè)存儲(chǔ)服務(wù)拉取照片打印的功能。便興沖沖地嘗試了一下 。大致的過(guò)程是這樣的:
- 用戶告訴打印平臺(tái): 聽(tīng)說(shuō)你能從XX相冊(cè)存儲(chǔ)服務(wù)把我照片給拉過(guò)來(lái)打印,給我操作一下。
- 打印平臺(tái)回復(fù)用戶:沒(méi)問(wèn)題,不過(guò)我得先給XX相冊(cè)存儲(chǔ)服務(wù)說(shuō)一下。我得帶上我自己的標(biāo)識(shí)clientId,還有你請(qǐng)求的事項(xiàng)權(quán)限scopes。以及遵循的流程類型authorizationGrantType。為了安全起見(jiàn)我們最好弄個(gè)state隨機(jī)碼防止中間人攻擊。XX相冊(cè)存儲(chǔ)服務(wù)會(huì)通過(guò)我提供的專線redirectUri進(jìn)行給您確認(rèn),您到時(shí)候確認(rèn)一下。
- XX相冊(cè)存儲(chǔ)服務(wù)向用戶確認(rèn):您是不是要授權(quán)給XX打印平臺(tái)拉取您的照片?
- 用戶確認(rèn)的話需要向XX相冊(cè)存儲(chǔ)服務(wù)提供自己的用戶憑證并確認(rèn);否則拒絕,流程到此結(jié)束。
- XX相冊(cè)存儲(chǔ)服務(wù)收到用戶的確認(rèn)信息后回復(fù)打印平臺(tái): 用戶確認(rèn)過(guò)了,給您一個(gè)臨時(shí)憑證code(authorizationGrantType=code) ,你來(lái)?yè)QToken然后就可以憑此拉取該用戶的照片了。
- 打印平臺(tái)換取了Token成功地拉取了該用戶的照片并打印。
- 用戶不用來(lái)回奔波就享受了跨平臺(tái)云打印服務(wù),用戶體驗(yàn)度得到了提升。
OIDC的產(chǎn)生背景
OAuth 2.0協(xié)議只解決了授權(quán)的問(wèn)題,客戶端只要得到了資源所有者的授權(quán)就能訪問(wèn)資源。OAuth 2.0本身并沒(méi)有提供用戶認(rèn)證的規(guī)范。
OAuth 2.0本身無(wú)法證明資源所有者就是正確的資源所有者。OAuth 2.0中涉及的用戶認(rèn)證都建立在其它認(rèn)證的可靠性之上,OAuth 2.0只消費(fèi)認(rèn)證的結(jié)果并不參與認(rèn)證的流程。
基于這個(gè)原因OpenID Connect誕生了。它和OAuth 2.0的關(guān)系是這樣的:
- interface OIDC extends OAuth2{
- boolean authentication ()
- }
也就是說(shuō)OIDC 在OAuth 2.0 的基礎(chǔ)之上增加一個(gè)對(duì)資源所有者的認(rèn)證流程,實(shí)現(xiàn)了真正意義上的認(rèn)證授權(quán)?;谄脑?,我會(huì)在后續(xù)系列文章中和大家共同學(xué)習(xí)OIDC協(xié)議。如果你有什么疑問(wèn)可以留言討論。
本文轉(zhuǎn)載自微信公眾號(hào)「碼農(nóng)小胖哥」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系碼農(nóng)小胖哥公眾號(hào)。