跨域驗證本身存在著許多風險,其中最知名的中間人攻擊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/