谈谈SSO单点登录的设计实现
談?wù)凷SO單點(diǎn)登錄的設(shè)計(jì)實(shí)現(xiàn)
本篇將會講講單點(diǎn)登錄的具體實(shí)現(xiàn)。
實(shí)現(xiàn)思路
其實(shí)單點(diǎn)登錄在我們生活中很常見,比如學(xué)校的網(wǎng)站,有很多個(gè)系統(tǒng),迎新系統(tǒng),教務(wù)系統(tǒng),網(wǎng)課系統(tǒng)。我們往往只需要登錄一次就能在各個(gè)系統(tǒng)中被認(rèn)定為登錄狀態(tài)。
這是怎么實(shí)現(xiàn)的?我們需要一個(gè)認(rèn)證中心,一如學(xué)校網(wǎng)站也有一個(gè)統(tǒng)一認(rèn)證中心,也就是我們的SSO的Server端。在每個(gè)系統(tǒng)也就是Client端,我們只要判斷已經(jīng)在這個(gè)認(rèn)證中心中登錄,那我們就會被設(shè)置為登錄狀態(tài)。
再來就是最后一個(gè)問題了,我們判斷在認(rèn)證中心登錄后,怎么在其他系統(tǒng)中也登錄?
這個(gè)問題其實(shí)就是單點(diǎn)登錄中最麻煩的問題了,也就是如何傳播我們的登錄狀態(tài)。
我們可以分為兩個(gè)情況Cookie共享傳播狀態(tài),url參數(shù)傳播狀態(tài)。
Cookie共享傳播狀態(tài)
第一種情況:我們的認(rèn)證中心和其他系統(tǒng)是在一個(gè)域名下的,認(rèn)證中心為父域名(jwxt.com),其他系統(tǒng)是子域名(yx.jwxt.com),或者是同一IP不同端口的情況,我們的服務(wù)端通過cookie去判斷是否登錄。
在這種情況下我們只要在認(rèn)證中心登錄成功的時(shí)候設(shè)置Cookie,當(dāng)然設(shè)置Cookie的時(shí)候也要注意設(shè)置好你的Cookie參數(shù)。
要注意設(shè)置的參數(shù)是domin,path。這兩個(gè)參數(shù)值決定了Cookie的作用域。domin要設(shè)置為父域名(.jwxt.com)。當(dāng)然還要注意一個(gè)SameSite參數(shù),不能設(shè)置為None。(如果為None,你在baidu.com登錄,在example.com網(wǎng)站如果你點(diǎn)擊了 https://baidu.com/delete鏈接,會帶著你在baidu.com的Cookie訪問。)
設(shè)置完Cookie,子域名的系統(tǒng)也有了Cookie,自然就會被服務(wù)端判斷為登錄狀態(tài)。
簡而言之,就是利用Cookie共享來實(shí)現(xiàn)登錄狀態(tài)的傳播。
url參數(shù)傳播狀態(tài)
第二種我們的認(rèn)證中心和其他系統(tǒng)不在一個(gè)域名下的,或者是不同IP的情況。
為了安全瀏覽器限制cookie跨域,也就是說第一種方法就不管用了。
這種情況可以通過傳播參數(shù)來實(shí)現(xiàn),也就是在認(rèn)證中心登錄后帶著 登錄憑證(token) 重定向到對應(yīng)的Client頁面,然后我們的前端就可以用js獲取到url中的token進(jìn)行存儲(設(shè)置到Cookie或者localstorage等方式),之后我們的服務(wù)端只需要通過這個(gè)token就可以判斷為登錄狀態(tài)了。
當(dāng)然,為了安全我們往往不會直接傳遞憑證,而是傳遞一個(gè)校驗(yàn)碼ticket,然后前端發(fā)送ticket到服務(wù)端校驗(yàn)ticket,校驗(yàn)成功,就進(jìn)行登錄,設(shè)置Cookie或者存儲token。
流程
接下來我們梳理一下流程,一下Client為需要單點(diǎn)登錄的系統(tǒng),Server為統(tǒng)一認(rèn)證中心。
Cookie共享傳播狀態(tài)
- 用戶在Client1,如果沒有登錄,跳轉(zhuǎn)到Server,判斷在Server是否登錄,如果判斷沒有登錄,要求登錄,登錄成功后設(shè)置Cookie,跳轉(zhuǎn)Client
- Client1登錄成功
如果之后在Client2頁面,由于共享Cookie,當(dāng)然也是登錄狀態(tài)。
url參數(shù)傳播狀態(tài)
- 用戶在Client1,判斷沒有登錄,跳轉(zhuǎn)到Server,判斷在Server是否登錄,如果沒有登錄,要求登錄,登錄成功后設(shè)置Cookie,帶著ticket跳轉(zhuǎn)Client。
- 到了Client1,前端通過參數(shù)獲取到ticket,發(fā)送到服務(wù)端,服務(wù)端校驗(yàn)ticket獲取登錄id,設(shè)置Cookie進(jìn)行登錄。
之后在Client2頁面
- 用戶在Client2,判斷沒有登錄,跳轉(zhuǎn)到Server,判斷在Server是否登錄,這時(shí)候判斷為登錄,帶著ticket(或者token)跳轉(zhuǎn)Client。
- 到了Client2,前端通過參數(shù)獲取到ticket,發(fā)送到服務(wù)端,服務(wù)端校驗(yàn)ticket獲取登錄id,設(shè)置Cookie進(jìn)行登錄。
如果不使用ticket校驗(yàn)就直接存儲傳播過來的登錄憑證即可,當(dāng)然如果你不存儲到Cookie,記得在請求后端服務(wù)的時(shí)候帶上token。
ticket校驗(yàn)
再說說ticket校驗(yàn)
ticket校驗(yàn)根據(jù)情況也可以分為兩種,一種情況是Server和Client的后端共用的同一個(gè)Redis或者Redis集群,可以直接向Redis請求校驗(yàn)。如果后端用的Redis不同,可以發(fā)送http請求到Server端在Server端校驗(yàn)。
到此,單點(diǎn)登錄就完成了。
當(dāng)然在以上描述中的Cookie你也可以不使用,使用Cookie主要是方便,在請求后端時(shí)會自動發(fā)送。你只需要存儲到localstorage/sessionstorage等地方,請求后端的時(shí)候記得get然后帶上即可。
總結(jié)
以上是生活随笔為你收集整理的谈谈SSO单点登录的设计实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网那些技术 | 扒一扒互联网Mark
- 下一篇: 二叉树理论基础