跨域 Cookie 實現單點登陸

單點登陸

單點登陸(SSO - Single Sign On):對於同一個客戶端(例如 Chrome 瀏覽器),只要登陸了一個子站(例如 a.com),則全部子站(b.com、c.com)都認爲已經登陸。html

好比用戶在登陸淘寶後,跳轉到天貓時就已經登陸了。跨域

用例步驟

  1. 未登陸用戶訪問子站 a.com 進行登陸,自動跳轉到帳戶中心的統一登陸頁 account.com/login瀏覽器

  2. 用戶在統一登陸頁進行登陸,登陸成功後顯示登陸跳轉頁cookie

  3. 顯示登陸跳轉頁後自動跳轉回 a.com,單點登陸完成ide

  4. 用戶在訪問 b.com 時無需再次登陸性能

實現原理

登陸

  1. 統一登陸頁登陸請求完成後響應爲登陸跳轉頁ui

  2. 登陸跳轉頁中通知各子站進行登陸加密

<script src='b.com/login?uid=xxxx&token=xxxxx'></script>
<script src='c.com/login?uid=xxxx&token=xxxxx'></script

 3. 子站收到登陸請求後驗證 token 是否有效,有效的話在響應中設置 cookie(user_token=xxxx)code

token 驗證

  • 帳戶中心使用私鑰加密 user id,生成 tokenhtm

  • 子站使用公鑰解密 token,將獲得的 user id 和參數 uid 對比,若是同樣就是校驗經過

登出

  1. 用戶在某個子站主動登出時跳轉到帳戶中心統一登出頁 account.com/logout?uid=xxxx&token=xxxx

  2. 帳戶中心驗證 token 後進行登出,在登出跳轉頁中通知各子站進行登出(設置 cookie),相似登陸通知

  3. 子站收到登出請求後驗證 token 是否有效,有效的話在響應中設置 cookie(刪除 user_token)

關鍵點

  • 瀏覽器渲染登陸跳轉頁時將執行上面用 <script> 發送的登陸通知請求,執行完後(或者超時)才跳轉回前面登陸的子站

  • 登陸通知請求是跨域的(當前域是帳戶中心 account.com),因此在響應中設置 cookie 時 IE 某些版本須要設置 P3P 頭

  • 在驗證 token 時能夠考慮使用帳戶中心提供高性能的驗證接口,子站進行調用

相關文章
相關標籤/搜索