OAuth 2.1 的進化之路

SpringLeee發表於2021-11-23

背景

2010年, OAuth 授權規範 1.0 (rfc 5849) 版本釋出, 2年後, 更簡單易用的 OAuth 2.0 規範釋出(rfc 6749), 這也是大家最熟悉並且在網際網路上使用最廣泛的版本, 在2012年的時候, iPhone 5 是全新的, 微軟最新的瀏覽器還是 IE9, 單頁面應用在當時還被稱作 "Ajax 應用", CORS(跨域資源共享)還不是一個W3C標準。

到現在, 網路和移動領域發生了巨大的變化, 當時釋出的授權協議標準已經遠遠不能滿足現在的場景和需求, 為了應對這種不斷變化的局面, OAuth 社群多年來一直在修補和擴充套件 OAuth 規範, OAuth 的格局也不斷擴大, 越來越多的圍繞 OAuth 2.0 core 的擴充套件授權規範出現, 也讓 OAuth 2.0 整體看起來就像一個迷宮一樣。

不斷進化的 OAuth 2.0

在 OAuth 2.0 核心規範 (RFC 6749)中, 定義了四種授權型別:授權碼、隱式、密碼和客戶端憑據, 如下:

相信大家都很熟悉, 在 OAuth 2.0 中,最安全也是使用最普遍的就是授權碼模式, 而對於本地應用,移動應用來說, 通常會使用隱式和密碼授權, 這兩種本身就是不安全的, 因為這些屬於公開的客戶端, 本身沒有能力保護客戶端機密, 但是當時並沒有其它好的方案。

為了解決 OAuth 2.0 對公開客戶端的授權安全問題, PKCE (RFC 6379)協議應運而生, 全稱是 Proof Key for Code Exchange,PKCE 的原理是, 對於公共的客戶端, 如果不能使用客戶端祕鑰(client_secret), 那客戶端就提供一個自建立的證明 (code_verifier) 給授權伺服器,其中使用了加密演算法, 授權伺服器通過它來驗證客戶端。

後來,"OAuth 2.0 for Native Apps"(RFC 8252)規範釋出,推薦原生應用也使用授權碼 + PKCE。

隨著技術不斷地發展, 出現了裝置授權的場景, 這裡裝置指智慧電視,印表機等, 和傳統的PC或者手機不同, 這種裝置是缺少瀏覽器或者鍵盤的,那 OAuth 2.0 常規的授權模式肯定是不能滿足的, 於是就出現了裝置授權(Device Grant) 。

在 OAuth 2.0 安全最佳實踐(Security BCP)中, 棄用了隱式和密碼授權,並且推薦所有的客戶端都應該使用 Authorization Code + PKCE 的組合。

最終, 調整後的 OAuth 授權模式會更加精簡, 轉換成下面三種, 這也是 OAuth 2.1 的思想, 參考安全最佳實踐(BCP),取其精華, 去其糟粕。

總結

歸根結底, OAuth 2.1 並不是要推翻 OAuth 2.0,而是根據其安全最佳實踐(BCP), 移除不安全的授權流程, 並且對擴充套件協議進行整合, 讓原本複雜如迷宮的 OAuth 2.0 規範成為更易用,更安全的授權規範。

References

The OAuth 1.0 Protocol
The OAuth 2.0 Authorization Framework
The OAuth 2.1 Authorization Framework draft-ietf-oauth-v2-1-04
It's Time for OAuth 2.1
OAuth 2.0 for Native Apps
OAuth 2.0 Device Authorization Grant
Proof Key for Code Exchange by OAuth Public Clients

OAuth 2.1 的進化之路

相關文章