被廣泛使用的OAuth2.0的密碼模式已經廢了,放棄吧

最近一直有同學在問,OAuth2密碼模式爲啥Spring Security還沒有實現,就連新的Spring Authorization Server也沒有這個玩意兒。

其實這裏可以告訴大家,OAuth2密碼模式廢了,OAuth2 安全指南相關的章節。以後新的OAuth2實現基本不太會可能積極去適配這個模式了。諸如Auth0JIRA等知名產品都已經在產品中移除了該模式。用的好好的爲什麼要移除呢?胖哥找了一些資料,大致上有幾點。

OAuth2是一個授權框架

OAuth2本身是一個授權框架,它並沒有對用戶的認證流程做出定義。它的初衷是解決不同服務之間的授權訪問問題,它無法明確你認爲正確的接收者就是那個接收者。目前只有OAuth2的擴展協議OIDC 1.0才具有用戶認證功能。

密碼模式更像一種兼容性的協議

密碼模式誕生的時候,像ReactVue這種單頁應用還沒有興起,甚至連框架都還沒有呢。它更像一種爲了解決遺留問題而採用的過渡方案。在傳統應用中,用戶習慣了把密碼直接交給客戶端換取資源訪問權限,而不是跳來跳去拉授權、確認授權。OAuth2誕生之時爲了讓用戶從傳統思維中慢慢轉變過來就設計了這種模式。

這種模式好用,但它打破了委託授權的模式,降低了OAuth2的安全性。

它的流程非常像“網絡釣魚攻擊”,想象一下應用程序隨意的讓你在一個平臺的登錄頁面中輸入另一個平臺的密碼,如果兩個平臺都是可信的,這樣做也無可厚非。但是它真的可信嗎?沒人敢打包票。

對於安全而言,這擴大了密碼暴露的面積,密碼總是被提示小心保管避免泄露,這妥妥是一種反密碼模式。用戶密碼可能有意無意就在這個鏈路中泄露出去了。而且用戶無法控制授權的範圍,雖然用戶限制了scope,但是客戶端程序依然提供了編程機會來打破用戶的scope。如果在公共OAuth2客戶端上使用密碼模式,你的令牌端點也可能會被嗅探到,進而被暴力窮舉。

因此在OAuth2最佳實踐中已經明確要求不能使用這種模式,甚至在聲明中用了MUST NOT BE這個字眼。

替代品是什麼?

OAuth2.1中,已經僅僅只有這三種

  • Authorization Code+ PKCE 如果你需要安全授權請使用這種模式。
  • Client Credentials 如果你的客戶端需要同其它客戶端進行資源交互請使用這種模式
  • Device Code 如果你正在開發的IoT應用想使用OAuth2,可以考慮這種模式。

相比較而言,OAuth2.1更加註重安全性,目前正在起草階段。

那如果我還是需要進行用戶認證呢?目前只有OIDC 1.0可選了。所以各位同學,未來的方向應該明確了吧,密碼模式是應該被放棄的時候了。

關注公衆號:Felordcn 獲取更多資訊

個人博客:https://felord.cn

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章