單點(diǎn)登錄(后文簡稱:sso)的定義是在多個應(yīng)用系統(tǒng)中,用戶只需要登錄一次就可以訪問所有相互信任的應(yīng)用系統(tǒng)(摘自百度百科)。整個流程中涉及到的角色有:

  • 用戶。

  • 應(yīng)用服務(wù)器,即業(yè)務(wù)系統(tǒng)。

  • 單點(diǎn)登錄服務(wù)器,所有業(yè)務(wù)系統(tǒng)登錄的核心樞紐,后文簡稱用戶中心。

 

關(guān)于token同步的思考

從其定義中不難發(fā)現(xiàn),核心功能點(diǎn):一處登錄處處登錄,注銷亦然。那么如何實(shí)現(xiàn)一處登錄處處登錄,先拋開網(wǎng)上各種解決思路回到問題本身。用戶中心登錄成功后產(chǎn)生的token(或者說“票據(jù)”,后文統(tǒng)一稱token)如果能夠同步到各個業(yè)務(wù)系統(tǒng),而各個業(yè)務(wù)系統(tǒng)能成功解析token后即可認(rèn)為達(dá)到了一處登錄處處登錄。所以關(guān)鍵問題在于:

  1. 如何在用戶中心登錄成功后將token同步到各個業(yè)務(wù)系統(tǒng)。

  2. 各業(yè)務(wù)系統(tǒng)如何能夠成功解析token。

 

其中各業(yè)務(wù)系統(tǒng)解析token很好解決,和用戶中心約定一套公用的加密/解密方式即可。那么問題一,由于token的存儲一般在于瀏覽器,而從用戶中心服務(wù)器發(fā)起請求到各個業(yè)務(wù)系統(tǒng)是在瀏覽器端寫不了token的。那么換種思路,在登錄成功后從瀏覽器端向各個業(yè)務(wù)系統(tǒng)發(fā)起請求寫入token。

 

關(guān)于登錄功能使用的思考

而由于用戶中心被許多業(yè)務(wù)系統(tǒng)所使用,各系統(tǒng)所使用的開發(fā)語言未必能完全統(tǒng)一,于是有功能點(diǎn)二:登錄服務(wù)的調(diào)用應(yīng)該是易用且與平臺語言無關(guān)的。這個問題可按兩種不同的思路來解決:

  1. 業(yè)務(wù)系統(tǒng)沒有登錄頁面,直接跳轉(zhuǎn)用戶中心登錄并將token同步至所有業(yè)務(wù)系統(tǒng)。

  2. 業(yè)務(wù)系統(tǒng)有登錄頁面,直接引用用戶中心sso.js調(diào)用登錄并將token同步至所有業(yè)務(wù)系統(tǒng)。

 

關(guān)于登錄用戶權(quán)限的思考

假定有業(yè)務(wù)系統(tǒng)A、B、C、D。用戶1可登錄系統(tǒng)A、B,用戶2可登錄系統(tǒng)B、C、D,于是有功能點(diǎn)三:用戶中心應(yīng)該可以控制用戶所能登錄的業(yè)務(wù)系統(tǒng)。在登錄生成token時,加入能夠登錄的業(yè)務(wù)系統(tǒng)信息,在登錄成功后,只向能夠登錄的業(yè)務(wù)系統(tǒng)發(fā)起同步token的請求,并且各業(yè)務(wù)系統(tǒng)在token解析后需要驗(yàn)證token是否具有當(dāng)前系統(tǒng)的登錄權(quán)限。

 

關(guān)于token刷新策略的思考

關(guān)于token的刷新策略,token應(yīng)該什么時候刷新,在sso系統(tǒng)中,token刷新后又該如何通知到其他業(yè)務(wù)系統(tǒng)。第一個問題參考o(jì)win的cookie登錄,在請求中,判斷token是否超過有效期的一半,超過則刷新。第二個問題就麻煩了,因?yàn)閠oken的刷新是跟隨正常請求的,我們就不能再使用像登錄那樣依靠瀏覽器去通知所有業(yè)務(wù)系統(tǒng)了,關(guān)于這個問題,有三種解決思路:

  1. 各系統(tǒng)定時刷新token并通知各個業(yè)務(wù)系統(tǒng)。

  2. token只存于用戶中心,向各個業(yè)務(wù)系統(tǒng)發(fā)放該token的key,各業(yè)務(wù)系統(tǒng)根據(jù)key向用戶中心獲取token并緩存,緩存的過期時間為是token下次應(yīng)該刷新的時間。

  3. 共享一個分布式token存儲系統(tǒng),可使用redis,向各個業(yè)務(wù)系統(tǒng)發(fā)放token的key,需要刷新時直接使用key刷新redis中的token。

 

巴拉巴拉講了一堆,也不知道大伙們能理解多少,權(quán)當(dāng)記錄我在開發(fā)過程中的一些思考吧,當(dāng)然少不了大家喜聞樂見