單點(diǎn)登錄(后文簡(jiǎn)稱(chēng):sso)的定義是在多個(gè)應(yīng)用系統(tǒng)中,用戶(hù)只需要登錄一次就可以訪問(wèn)所有相互信任的應(yīng)用系統(tǒng)(摘自百度百科)。整個(gè)流程中涉及到的角色有:
用戶(hù)。
應(yīng)用服務(wù)器,即業(yè)務(wù)系統(tǒng)。
單點(diǎn)登錄服務(wù)器,所有業(yè)務(wù)系統(tǒng)登錄的核心樞紐,后文簡(jiǎn)稱(chēng)用戶(hù)中心。
關(guān)于token同步的思考
從其定義中不難發(fā)現(xiàn),核心功能點(diǎn):一處登錄處處登錄,注銷(xiāo)亦然。那么如何實(shí)現(xiàn)一處登錄處處登錄,先拋開(kāi)網(wǎng)上各種解決思路回到問(wèn)題本身。用戶(hù)中心登錄成功后產(chǎn)生的token(或者說(shuō)“票據(jù)”,后文統(tǒng)一稱(chēng)token)如果能夠同步到各個(gè)業(yè)務(wù)系統(tǒng),而各個(gè)業(yè)務(wù)系統(tǒng)能成功解析token后即可認(rèn)為達(dá)到了一處登錄處處登錄。所以關(guān)鍵問(wèn)題在于:
如何在用戶(hù)中心登錄成功后將token同步到各個(gè)業(yè)務(wù)系統(tǒng)。
各業(yè)務(wù)系統(tǒng)如何能夠成功解析token。
其中各業(yè)務(wù)系統(tǒng)解析token很好解決,和用戶(hù)中心約定一套公用的加密/解密方式即可。那么問(wèn)題一,由于token的存儲(chǔ)一般在于瀏覽器,而從用戶(hù)中心服務(wù)器發(fā)起請(qǐng)求到各個(gè)業(yè)務(wù)系統(tǒng)是在瀏覽器端寫(xiě)不了token的。那么換種思路,在登錄成功后從瀏覽器端向各個(gè)業(yè)務(wù)系統(tǒng)發(fā)起請(qǐng)求寫(xiě)入token。
關(guān)于登錄功能使用的思考
而由于用戶(hù)中心被許多業(yè)務(wù)系統(tǒng)所使用,各系統(tǒng)所使用的開(kāi)發(fā)語(yǔ)言未必能完全統(tǒng)一,于是有功能點(diǎn)二:登錄服務(wù)的調(diào)用應(yīng)該是易用且與平臺(tái)語(yǔ)言無(wú)關(guān)的。這個(gè)問(wèn)題可按兩種不同的思路來(lái)解決:
業(yè)務(wù)系統(tǒng)沒(méi)有登錄頁(yè)面,直接跳轉(zhuǎn)用戶(hù)中心登錄并將token同步至所有業(yè)務(wù)系統(tǒng)。
業(yè)務(wù)系統(tǒng)有登錄頁(yè)面,直接引用用戶(hù)中心sso.js調(diào)用登錄并將token同步至所有業(yè)務(wù)系統(tǒng)。
關(guān)于登錄用戶(hù)權(quán)限的思考
假定有業(yè)務(wù)系統(tǒng)A、B、C、D。用戶(hù)1可登錄系統(tǒng)A、B,用戶(hù)2可登錄系統(tǒng)B、C、D,于是有功能點(diǎn)三:用戶(hù)中心應(yīng)該可以控制用戶(hù)所能登錄的業(yè)務(wù)系統(tǒng)。在登錄生成token時(shí),加入能夠登錄的業(yè)務(wù)系統(tǒng)信息,在登錄成功后,只向能夠登錄的業(yè)務(wù)系統(tǒng)發(fā)起同步token的請(qǐng)求,并且各業(yè)務(wù)系統(tǒng)在token解析后需要驗(yàn)證token是否具有當(dāng)前系統(tǒng)的登錄權(quán)限。
關(guān)于token刷新策略的思考
關(guān)于token的刷新策略,token應(yīng)該什么時(shí)候刷新,在sso系統(tǒng)中,token刷新后又該如何通知到其他業(yè)務(wù)系統(tǒng)。第一個(gè)問(wèn)題參考o(jì)win的cookie登錄,在請(qǐng)求中,判斷token是否超過(guò)有效期的一半,超過(guò)則刷新。第二個(gè)問(wèn)題就麻煩了,因?yàn)閠oken的刷新是跟隨正常請(qǐng)求的,我們就不能再使用像登錄那樣依靠瀏覽器去通知所有業(yè)務(wù)系統(tǒng)了,關(guān)于這個(gè)問(wèn)題,有三種解決思路:
各系統(tǒng)定時(shí)刷新token并通知各個(gè)業(yè)務(wù)系統(tǒng)。
token只存于用戶(hù)中心,向各個(gè)業(yè)務(wù)系統(tǒng)發(fā)放該token的key,各業(yè)務(wù)系統(tǒng)根據(jù)key向用戶(hù)中心獲取token并緩存,緩存的過(guò)期時(shí)間為是token下次應(yīng)該刷新的時(shí)間。
共享一個(gè)分布式token存儲(chǔ)系統(tǒng),可使用redis,向各個(gè)業(yè)務(wù)系統(tǒng)發(fā)放token的key,需要刷新時(shí)直接使用key刷新redis中的token。
巴拉巴拉講了一堆,也不知道大伙們能理解多少,權(quán)當(dāng)記錄我在開(kāi)發(fā)過(guò)程中的一些思考吧,當(dāng)然少不了大家喜聞樂(lè)見(jiàn)