東莞常平電鍍工業(yè)園東莞seo優(yōu)化公司
通常我們會(huì)對(duì)token設(shè)置一個(gè)有效期,于是,就有了token續(xù)簽的問題。由于token并沒有續(xù)時(shí)機(jī)制,如果不能及時(shí)的替換掉過(guò)期的token,可能會(huì)攔截用戶正常的請(qǐng)求,用戶只能重新登錄,如果提交的信息量很大,會(huì)給用戶帶來(lái)很不愉快的用戶體驗(yàn)
續(xù)簽方法
在token快過(guò)期時(shí)返回一個(gè)新的token
用戶每次進(jìn)入系統(tǒng)時(shí)刷新token,比如小程序登錄
采用refreshToken機(jī)制
token里存儲(chǔ)了用戶的權(quán)限,當(dāng)用戶狀態(tài)發(fā)生改變時(shí)
在token快過(guò)期時(shí)返回新的token
在服務(wù)器端可以校驗(yàn)即將過(guò)期的token,比如將token存在于redis中,可以用token的TTL去獲取token的過(guò)期時(shí)間,如果時(shí)間比較短,就可以順便返回一個(gè)新的token,這種方式對(duì)于前后端都不友好,客戶端和服務(wù)端都需要去判斷邏輯,會(huì)帶來(lái)很大的性能損耗。
用戶每次進(jìn)入系統(tǒng)時(shí)刷新token
這種場(chǎng)景比較適用于小程序,可以在用戶每次進(jìn)入小程序時(shí)就去返回一個(gè)新的token,只要token的有效時(shí)間合適,是一個(gè)不錯(cuò)的選擇方案
refreshToken機(jī)制
refreshToken是token的另一種延申
用戶登錄成功后返回兩個(gè) token :一個(gè)是 acessToken ,它的過(guò)期時(shí)間可以比較短,比如是1天;另外一個(gè)是 refreshToken 它的過(guò)期時(shí)間更長(zhǎng)一點(diǎn),比如3天。
當(dāng)客戶端登錄后,將 accessToken和refreshToken 保存在客戶端本地,每次訪問將 accessToken 傳給服務(wù)端。服務(wù)端校驗(yàn) accessToken 的有效性,如果客戶端收到token過(guò)期的話,就將 refreshToken 傳給服務(wù)端。
服務(wù)端 驗(yàn)證refreshToken 是否有效,若有效服務(wù)端就生成新的 accessToken和refreshToken 給客戶端。否則,客戶端就需要重新登錄
這種方式可以減少用戶進(jìn)行賬號(hào)密碼登錄的次數(shù),但也會(huì)帶來(lái)一些盜用和過(guò)期的風(fēng)險(xiǎn),我們可以從以下幾個(gè)方面去優(yōu)化
性能優(yōu)化
我們可以將其直接保存在數(shù)據(jù)庫(kù)中,只會(huì)在客戶端得到token過(guò)期時(shí)才會(huì)向服務(wù)器端發(fā)起請(qǐng)求
安全優(yōu)化
只有在需要續(xù)簽的時(shí)候才會(huì)帶上,每個(gè)refreshToken只會(huì)被使用一次,當(dāng)refreshToken被獲取時(shí),不會(huì)被大量濫用
可以設(shè)置refreshToken的生成機(jī)制,與客戶端client_id綁定,設(shè)置獨(dú)立的secret,在驗(yàn)證有效性時(shí),會(huì)對(duì)比登錄時(shí)的客戶端client_id,相對(duì)安全
可用性優(yōu)化
客戶端可以設(shè)置定時(shí)器,在accessToken 快過(guò)期的時(shí)候,提前去通過(guò) refreshToken 獲取新的accessToken,防止出現(xiàn)短暫的token不可用
refreshToken是一種很好的方案進(jìn)行JWT續(xù)簽,與 OAuth2.0中的刷新機(jī)制類似