跨域驗證本身存在著許多風險,其中最知名的中間人攻擊Man-in-the-middle attack (MitM attacks),透過劫持 wifi 傳輸過程中所訪問的router ,解析其中的憑證,就能來偽裝用戶進行登入。
若採用 SSL及可防止網路請求被攔截,
針對單一單入即可在不同 Domain 做跨域驗證的做法,最知名的就是 Single sign on (sso)
Universal Login
Universal Login 是一個簡單即可實現 SSO 的方式,不必密碼的 Passwordless Authentication就能達到跨域驗證的目的
例如,透過簡訊或 E-mail 收取驗證碼,輸入驗證碼即可登入
Single sign on
下圖可以說明 Single sign on 的核心
原則上就是透過一個 sso 中央帳號管理中心來進行驗證
- 認證 Authentication
- 授權 Authorization
- 用戶資料交換 User attributes exchange
- 用戶管理 User management
針對在 domain a 登入之後,希望在 domain b 沿用同樣的使用者及登入認證,就可以透過 sso 來達成
底下這張圖,詳述了整個 sso 帳號跨域登入的重點
但是在圖片中需要克服幾點問題
基於安全性,在瀏覽器的同源策略中,不同 domain 所產生的 cookie 只能各自管理及使用,不能互相提取及干擾
因此,實際執行時,會發現有以下狀況
因此,需要對流程進行修正
透過一個中央網域(central domain)來管理 session ,不同網域之間都會透過中央進行權限的溝通,當其中一個子網域透過中央登入成功時,中央會產生 session,並且產生一個JWT 給子網域
當跳轉到另一個子網域時,子網域會先向中央確認,當中央有 session 時,就會確認合法,並且分配 JWT 給子網域
更詳細的流程可以參考下圖:
其中主要重點是,當使用者在第一個子網域登入過中央系統,前往其他子網域時,中央會立刻從 session 得知該用戶已經登入過,因此會立刻返回及夾帶一個後續驗證所需的 token
關於 SSO 協議
目前SSO 已經多種實作做法,例如:OpenID Connect, Facebook Connect, SAML, Microsoft Account ..等,其主要核心都是透過 passport 來驗證
OAuth 實作 SSO 流程圖則如下:
參考閱讀 https://auth0.com/blog/what-is-and-how-does-single-sign-on-work/