OAuth 2.0:徒有虛名?
設(shè)計(jì)標(biāo)準(zhǔn)時(shí),必須平衡靈活性和具體性。
譯自O(shè)Auth 2.0: A Standard in Name Only?,作者 Shon Urbas。
作為一家集成平臺(tái)公司的CTO,我花費(fèi)了無(wú)數(shù)時(shí)間分析數(shù)百個(gè)SaaS應(yīng)用程序中的OAuth 2.0實(shí)現(xiàn)。雖然OAuth 2.0經(jīng)常被吹捧為標(biāo)準(zhǔn),但現(xiàn)實(shí)情況遠(yuǎn)比這復(fù)雜和支離破碎。
OAuth 2.0于2012年出現(xiàn),作為OAuth 1.0的繼任者,旨在簡(jiǎn)化網(wǎng)絡(luò)和移動(dòng)應(yīng)用程序的授權(quán)流程。其目標(biāo)是崇高的:
- 強(qiáng)制使用SSL以增強(qiáng)安全性
- 簡(jiǎn)化OAuth 1.0中所需的復(fù)雜簽名過(guò)程
- 更好地支持快速普及的移動(dòng)設(shè)備
理論上,OAuth 2.0將為應(yīng)用程序提供一種統(tǒng)一的方式來(lái)請(qǐng)求對(duì)其他系統(tǒng)上用戶帳戶的有限訪問(wèn)權(quán)限,而無(wú)需共享密碼。這將使集成更安全,并更易于用戶和開(kāi)發(fā)人員管理。
支離破碎的景象
然而,OAuth 2.0實(shí)現(xiàn)的現(xiàn)實(shí)情況遠(yuǎn)非標(biāo)準(zhǔn)化。OAuth 1.0規(guī)范的作者Eran Hammer,他在OAuth 2.0發(fā)布期間著名的辭職,被引用說(shuō)——“幾乎任何東西都可以很容易地被稱(chēng)為符合OAuth 2.0標(biāo)準(zhǔn)”。
以下是一些關(guān)鍵問(wèn)題:
- 過(guò)度靈活:OAuth 2.0規(guī)范包含許多可選組件和流程。雖然出發(fā)點(diǎn)很好,但這導(dǎo)致了實(shí)現(xiàn)方式的巨大差異。
- 復(fù)雜性:OAuth 2.0核心規(guī)范長(zhǎng)達(dá)81頁(yè),但要完全理解它,需要閱讀20多個(gè)附加RFC中的數(shù)千頁(yè)內(nèi)容。這種復(fù)雜性使得開(kāi)發(fā)人員難以正確且一致地實(shí)現(xiàn)。
- 實(shí)現(xiàn)不一致:主要平臺(tái)經(jīng)常偏離核心規(guī)范或以獨(dú)特的方式實(shí)現(xiàn)特定的RFC。例如:
a.Microsoft Azure需要用于令牌刷新的重定向URI,這不是標(biāo)準(zhǔn)規(guī)范的一部分。
b.Wix有自己的“OAuth 2解決方案”,具有非標(biāo)準(zhǔn)的“基本”和“高級(jí)”流程。要刷新高級(jí)選項(xiàng),必須發(fā)送client_id和secret、訪問(wèn)令牌和刷新令牌,這很不尋常。
4.安全問(wèn)題:某些OAuth 2.0流程,例如資源所有者密碼憑據(jù)授權(quán),本質(zhì)上是不安全的,但規(guī)范仍然允許。
案例研究:簽名的回歸
具有諷刺意味的是,從OAuth 1.0遷移到2.0的主要原因之一是消除對(duì)復(fù)雜簽名的需求。然而,安全問(wèn)題導(dǎo)致引入了代碼交換證明密鑰(PKCE),在RFC 7636中指定。PKCE重新引入了一種類(lèi)似簽名的機(jī)制來(lái)防止特定攻擊,尤其是在移動(dòng)環(huán)境中。這一發(fā)展突顯了OAuth 2.0生態(tài)系統(tǒng)如何不得不發(fā)展以解決安全漏洞,有時(shí)是通過(guò)重新引入它最初試圖消除的概念。
一個(gè)很好的例子是Pleo,一家位于歐洲的費(fèi)用管理公司。RFC 7636于2015年發(fā)布,Pleo是我見(jiàn)到的第一家使用它的公司。他們針對(duì)此用例的API是在2022年創(chuàng)建的。他們對(duì)OAuth 2.0的其余遵守情況非常好。他們遵循所有“建議”,因?yàn)樗麄円呀?jīng)實(shí)現(xiàn)了PKCE。他們可能符合OAuth 2.1標(biāo)準(zhǔn),但稍后再詳細(xì)介紹。
什么構(gòu)成了一個(gè)好的標(biāo)準(zhǔn)?
一個(gè)好的標(biāo)準(zhǔn)在特異性、靈活性和簡(jiǎn)單性之間取得微妙的平衡。特異性至關(guān)重要,它通過(guò)諸如“必須”和“必需”之類(lèi)的詞語(yǔ)提供精確的要求。然而,靈活性同樣重要,以確保在各種實(shí)現(xiàn)中得到廣泛采用。關(guān)鍵在于找到適當(dāng)?shù)钠胶恻c(diǎn),避免過(guò)度選擇性,這可能導(dǎo)致實(shí)現(xiàn)不一致。
簡(jiǎn)潔性是另一個(gè)關(guān)鍵因素——一個(gè)好的標(biāo)準(zhǔn)應(yīng)該簡(jiǎn)潔易懂。例如,OAuth 1.0 的 81 頁(yè)規(guī)范與 OAuth 2.0 散布在多個(gè) RFC 中的數(shù)千頁(yè)形成鮮明對(duì)比,突出了復(fù)雜性如何成為一個(gè)重大缺點(diǎn)。最終,一個(gè)有效的標(biāo)準(zhǔn)提供了精確的強(qiáng)制性要求,同時(shí)允許必要的靈活性,所有這些都在一個(gè)易于理解的框架內(nèi),不會(huì)因過(guò)多的文檔而使實(shí)施者不知所措。
認(rèn)識(shí)到這些挑戰(zhàn),OAuth 社區(qū)正在開(kāi)發(fā) OAuth 2.1。此修訂旨在:
- 將最佳實(shí)踐和多個(gè) RFC 合并到單個(gè)綜合文檔中
- 要求所有客戶端都使用 PKCE,從而全面增強(qiáng)安全性
- 刪除有問(wèn)題的授權(quán)
- 統(tǒng)一處理公共客戶端和私有客戶端
- 強(qiáng)制限制刷新令牌和安全重定向
雖然 OAuth 2.1 有望解決許多當(dāng)前的痛點(diǎn),但它也引發(fā)了關(guān)于向后兼容性和采用時(shí)間表的問(wèn)題。
對(duì)開(kāi)發(fā)者和企業(yè)的影響
對(duì)于開(kāi)發(fā)者和構(gòu)建集成的企業(yè),當(dāng)前的 OAuth 2.0“標(biāo)準(zhǔn)”帶來(lái)了一些挑戰(zhàn):
- 開(kāi)發(fā)時(shí)間增加:每個(gè) OAuth 實(shí)現(xiàn)可能需要自定義代碼,從而增加開(kāi)發(fā)和維護(hù)成本。
- 安全風(fēng)險(xiǎn):如果不仔細(xì)管理,不一致的實(shí)現(xiàn)會(huì)導(dǎo)致安全漏洞。
- 用戶體驗(yàn)影響:OAuth 流程的變化可能會(huì)混淆最終用戶,并可能影響集成服務(wù)的采用。
- 合規(guī)性問(wèn)題:對(duì)于受監(jiān)管行業(yè)的企業(yè)而言,確保每個(gè) OAuth 實(shí)現(xiàn)都符合安全和隱私標(biāo)準(zhǔn)可能很復(fù)雜。
結(jié)論:OAuth 2.0 是否過(guò)于靈活而無(wú)法成為標(biāo)準(zhǔn)
雖然 OAuth 2.0 提供了一個(gè)授權(quán)框架,但其當(dāng)前狀態(tài)遠(yuǎn)非一個(gè)合適的標(biāo)準(zhǔn)。過(guò)度的靈活性和碎片化導(dǎo)致了一個(gè)生態(tài)系統(tǒng),其中“符合 OAuth 2.0”在實(shí)踐中可能意味著截然不同的東西。
當(dāng)我們展望 OAuth 2.1 和像 Grant Negotiation and Authorization Protocol (GNAP) 這樣的潛在替代方案時(shí),很明顯,對(duì)真正標(biāo)準(zhǔn)化、安全且對(duì)開(kāi)發(fā)者友好的授權(quán)協(xié)議的追求仍在繼續(xù)。與此同時(shí),開(kāi)發(fā)者和企業(yè)必須保持警惕,仔細(xì)評(píng)估他們遇到的每個(gè) OAuth 實(shí)現(xiàn),并構(gòu)建強(qiáng)大的系統(tǒng)來(lái)處理各種變化。
這節(jié)課的意義超越了 OAuth:在設(shè)計(jì)標(biāo)準(zhǔn)時(shí),平衡靈活性和特異性至關(guān)重要。過(guò)多的靈活性會(huì)導(dǎo)致碎片化,而過(guò)多的僵化會(huì)阻礙采用。隨著我們繼續(xù)構(gòu)建和連接數(shù)字系統(tǒng),找到這種平衡將是創(chuàng)建真正有效標(biāo)準(zhǔn)的關(guān)鍵。




























