看過(guò)不少JWT和單點(diǎn)登錄系統(tǒng)的文章,自己也算略知一二。
這里就根據(jù)自己的實(shí)際開(kāi)發(fā)經(jīng)驗(yàn)談一下我的理解。
大致可以總結(jié)為以下三種方案:
1. 純Jwt
2. Jwt + 認(rèn)證中心redis
3. Jwt + 認(rèn)證中心Redis + 多系統(tǒng)Redis
1. 純Jwt 方案
1. 用戶(hù)去認(rèn)證中心登錄,認(rèn)證中心生成jwt,返回給客戶(hù)端。
2. 客戶(hù)端攜帶jwt請(qǐng)求多個(gè)系統(tǒng)
3. 每個(gè)系統(tǒng)各自解析jwt,取出用戶(hù)信息。能解析成功就說(shuō)明jwt有效,繼續(xù)處理
自己的業(yè)務(wù)邏輯。
優(yōu)點(diǎn):認(rèn)證流程簡(jiǎn)單,服務(wù)端處理速度快。
缺點(diǎn):因?yàn)楹?jiǎn)單,所以不安全。jwt一旦下發(fā),有效期內(nèi)就無(wú)法使其主動(dòng)失效。
一句話(huà)總結(jié):認(rèn)證中心創(chuàng)建Jwt,其他系統(tǒng)解析。
2.Jwt + 認(rèn)證中心Redis
1. 用戶(hù)去認(rèn)證中心登錄,認(rèn)證中心生成jwt,保存到redis并返回給客戶(hù)端。
2. 客戶(hù)端攜帶jwt去多個(gè)系統(tǒng)認(rèn)證
3. 每個(gè)系統(tǒng)只負(fù)責(zé)從請(qǐng)求中取出jwt, 傳給認(rèn)證中心。認(rèn)證解析用戶(hù)信息,
并與redis中的jwt校驗(yàn),判斷是否有效。然后返回用戶(hù)信息給剛才發(fā)起驗(yàn)證請(qǐng)求的系統(tǒng)。
優(yōu)點(diǎn):安全性高,服務(wù)端能控制jwt主動(dòng)失效。
缺點(diǎn):每次請(qǐng)求需要認(rèn)證的接口,都需要訪(fǎng)問(wèn)認(rèn)證中心,耗時(shí)略長(zhǎng)。
一句話(huà)總結(jié):認(rèn)證中心負(fù)責(zé)Jwt的創(chuàng)建與解析,其他系統(tǒng)不參與認(rèn)證邏輯。
3.Jwt + 認(rèn)證中心redis + 多系統(tǒng)redis
1. 用戶(hù)去認(rèn)證中心登錄,認(rèn)證中心生成jwt,保存到redis并返回給客戶(hù)端。
2. 客戶(hù)端攜帶jwt去多個(gè)系統(tǒng)認(rèn)證
3. 多系統(tǒng)(比如系統(tǒng)A)收到j(luò)wt,A解析并取出用戶(hù)信息,先判斷自己的A的redis中
有沒(méi)有jwt。
3.1 如果有,就合法,a系統(tǒng)可以繼續(xù)執(zhí)行業(yè)務(wù)邏輯。
3.2 如果沒(méi)有就拿著jwt去認(rèn)證中心驗(yàn)證。
3.2.1 如果通過(guò),a系統(tǒng)就把這個(gè)jwt保存到自己的redis,并設(shè)置對(duì)應(yīng)的失效時(shí)間。
下次這個(gè)jwt再來(lái)到a的時(shí)候,就不需要去認(rèn)證中心校驗(yàn)了。
3.2.2 如果驗(yàn)證不通過(guò)此次請(qǐng)求就不合法,告訴客戶(hù)端需要跳轉(zhuǎn)登錄頁(yè)面,
去認(rèn)證中心登錄,返回步驟1。
優(yōu)點(diǎn):安全性高,平均認(rèn)證過(guò)程較快。
缺點(diǎn):服務(wù)端流程復(fù)雜,需要考慮jwt的同步問(wèn)題。比如注銷(xiāo)或重新登錄后,認(rèn)證中心
刪除舊jwt需要同步給其他系統(tǒng),其他系統(tǒng)刪除自己保存的jwt。
一句話(huà)總結(jié):認(rèn)證中心創(chuàng)建jwt,其他系統(tǒng)解析并校驗(yàn),需要保持jwt同步。
綜合總結(jié):
- 方案1才是Jwt的本質(zhì)。
- 方案2是我基于Jwt的改進(jìn),用作我們公司新項(xiàng)目的登錄系統(tǒng)。
(個(gè)人比較推薦方案3,后續(xù)考慮會(huì)向方案3轉(zhuǎn)移) - 方案3準(zhǔn)確說(shuō)是單點(diǎn)登錄系統(tǒng)的標(biāo)準(zhǔn)流程,只是結(jié)合了Jwt。其他2種方案都是偽單點(diǎn)。
備注: 文中使用Redis是為了單個(gè)系統(tǒng)集群機(jī)器之間能夠“Session共享”。






