考慮:
- SPA 或靜態生成的 JAMStack 網站(用 Vue/Nuxt 撰寫)。
- 在云中運行的 REST API (Node Express)。
該網站通過 CDN 提供服務。
為了方便用戶,我們需要添加社交登錄功能。API 已經使用基于憑證的 JWT(訪問/重繪 )令牌流對用戶進行身份驗證。社交登錄將是除此之外的。
我們選擇了授權代碼流作為此實作的機制(而不是PKCE,因為我們希望 SPA 使用 API 的訪問令牌而不是授權提供者的)。
我們的流程如下:
用戶單擊一個按鈕并被定向到身份提供者(在我們的例子中為谷歌)的網站以證明其身份。我們提供一個隨機生成的狀態令牌作為請求引數來防止 CSRF 攻擊。
在 IdP 的身份驗證頁面上,用戶提交他們的憑據,如果成功,用戶將被重定向回我們的網站(SPA),并使用狀態令牌和代碼作為 url 引數。
然后,我們將狀態值與我們在應用程式上生成的狀態值相匹配,以擊敗 CSRF 攻擊。
我們在 AJAX 請求中將代碼值發送到我們的 API。
API 獲取此代碼和我們的客戶端密鑰,并將它們交換為與身份提供者獲取的身份(忽略訪問令牌,因為我們只需要身份證明)。
如果驗證了用戶身份,API 會生成一對訪問和重繪 令牌并將它們發送到 SPA。(如果用戶在我們的資料庫中不存在,它會被添加并類似地為我們的 API 回傳令牌)。注意:我們根本不將從 IdP 接收到的身份令牌存盤在服務器上。
收到回應后,SPA 將訪問令牌存盤在 localStorage 中(重繪 令牌由 API 存盤在僅 HTTP 的 cookie 中)。
從 SPA 對我們 API 的所有進一步請求都是使用我們的 API 發出的訪問令牌發出的,一旦重繪 令牌和訪問令牌都過期(通過注銷或超時),用戶必須從步驟 1 重新啟動身份驗證流程。
我有兩個問題:
假設 IdP 和 SPA、SPA 和 API、API 和 IdP 之間的所有通信都是通過 TLS 進行的,我們的流程中是否存在任何安全漏洞?
這讓我更加困惑,您如何在頁面重定向之間保留我們在向身份驗證服務器的初始請求期間生成的狀態令牌?(從我們離開 SPA 在 IdP 的網頁上進行身份驗證到 IdP 將我們重定向回我們的 SPA)。localStorage 是一個足夠安全的選擇嗎?如果沒有, sessionStorage 就足夠了嗎?
uj5u.com熱心網友回復:
對于一個新專案,我會考慮使用 BFF 模式來避免在 SPA/瀏覽器中處理令牌。因為在瀏覽器中沒有安全的方式來處理/存盤令牌。
請查看這些資源,了解有關為什么建議新專案使用此模式的更多詳細資訊:
- 警報'OAuth 2 0'; // XSS 對 SPA 中 OAuth 2 0 的影響
- 使用 BFF 模式保護 SPA 和 #Blazor 應用程式
- BFF 模式(Backend for Frontend):簡介
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/484458.html
標籤:休息 oauth-2.0 单点登录 单页应用 开放式连接
上一篇:RESTGETAPI資料庫市場
下一篇:在客戶端重繪分頁資料的最佳方式?
