多系統單點登錄(sso)設計

問題提出

  • 多個系統中,如何做到其中一個系統登錄了,在瀏覽器中打開其他系統也會成登錄狀態?比如在淘寶登陸了,打開天貓網頁,也會顯示已登錄
  • 網上有一種設計方案是通過二級域名來共享登錄狀態,本設計是針對不同域名下登錄狀態的信息共享。

登錄信息共享機制設計

簡單實現

實現原理:

通過在sso系統域名下存儲信息,其他系統通過獲取sso域下的cookie信息來獲取登錄信息
不過有個問題:出於安全的原因,當前域不能獲取其他域的cookie信息,所以只能通過跨域訪問sso系統,然後返回登錄信息

在開始前我們設定兩個變量:

  • t_token 這個瀏覽器的一個標誌,在同一個瀏覽器中,所有相關係統內的網站共享同一個t_token
  • access_token 用戶真正的token

要實現上述功能,我們可以使用跨域機制來實現共享token。這裏我們設置三個系統,兩個客戶端系統,一個sso系統。如圖:
在這裏插入圖片描述

流程如下:
在這裏插入圖片描述
以上就是通過跨域來同步token的流程。

在上面的流程中,會存在一個跨域訪問的問題,一般來說有兩種解決方法:

  • 使用jsonp來獲取
  • 使用CORS機制跨域獲取數據

具體的可以看這兩篇文章:

CORS詳解
跨域訪問數據

淘寶天貓登錄信息共享(簡化版)

淘寶天貓token的獲取原理是一樣的,但是流程要稍複雜一些。主要是多了幾個重定向的步驟。廢話不多說,直接看時序圖,咱們看圖說話:
注:圖中設計的網址並非是實際的,我只是寫來做例子
在這裏插入圖片描述

可以看到,流程中經過多次的重定向最終使天貓中的cookie中有了t_tokenaccess_token的值

重定向的意義:
實際上我們完全可以通過跨域一次請求就可以把token拿到,就像我們的第一個例子一樣,爲什麼要經過這麼多次重定向呢。個人認爲有以下幾點:

  1. 獲取token的值完全由服務器設置到對應域名的cookie中,在安全方面更有保障
  2. 在請求過程中,服務器可以檢測該域名下的請求是否允許重定向,可以進一步保障安全

登錄流程

登錄流程相對來說大家比較熟悉,在此就簡單的寫下流程就行了。在登錄之後可以通過上面的設計共享token
流程如下:
在這裏插入圖片描述

登錄完成後再sso.com和a.com都有t_token,access_token。如果此時打開網頁b.com,跨域獲取訪問sso系統,然後獲得登錄信息

以上講了多系統單點登錄的原理和流程圖,其中需要注意的點是跨域訪問,如果不懂前端的,比如我一開始看到請求被拒絕訪問,也是一臉懵逼。我在文中也放了兩篇優秀的文章,不懂的可以看看。

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