Go項(xiàng)目實(shí)戰(zhàn)|企業(yè)級(jí)項(xiàng)目用戶認(rèn)證體系這么設(shè)計(jì)的
這節(jié)課開(kāi)始帶大家設(shè)計(jì)實(shí)現(xiàn)一個(gè)套支持多平臺(tái)登錄,Token泄露檢測(cè)、同平臺(tái)多設(shè)備登錄互踢功能的用戶認(rèn)證體系,這套用戶認(rèn)證體系既可以在你未來(lái)開(kāi)發(fā)產(chǎn)品時(shí)直接應(yīng)用,也可以在其基礎(chǔ)上根據(jù)需要擴(kuò)展出其他功能.它會(huì)作為我們后面商城App后端服務(wù)的的用戶認(rèn)證體系,同時(shí)又足夠獨(dú)立,能拿到自己的項(xiàng)目中去快速把用戶認(rèn)證給搭建起來(lái)。
說(shuō)到Token,很多人一開(kāi)始想到的可能是JWT -- JSON Web Token。
JWT因?yàn)槠浔举|(zhì)是存儲(chǔ)在客戶端cookie中,發(fā)布出去后服務(wù)端無(wú)法對(duì)其進(jìn)行主動(dòng)過(guò)期等控制,所以應(yīng)用場(chǎng)景跟這里介紹的用戶認(rèn)證體系不一樣,我們今天介紹的這套用戶認(rèn)證體系,在用戶體驗(yàn)、安全性和穩(wěn)定性上都會(huì)更完善,更適合在擁有C端用戶的產(chǎn)品上或者是擁有多個(gè)產(chǎn)品線的公司級(jí)項(xiàng)目中應(yīng)用。
想要設(shè)計(jì)出一個(gè)能滿足企業(yè)級(jí)項(xiàng)目需求的用戶認(rèn)證體系,我們需要從用戶體驗(yàn)、安全和穩(wěn)定性上來(lái)考慮,同時(shí)也要收集產(chǎn)品經(jīng)理、前端開(kāi)發(fā)對(duì)其在功能性上的要求,不能為了只考慮穩(wěn)定、高效而忽略了用戶體驗(yàn)。
從功能的用戶體驗(yàn)、安全性和穩(wěn)定性來(lái)看,通常一個(gè)足夠支撐企業(yè)級(jí)項(xiàng)目的認(rèn)證系統(tǒng)要滿足一下要求:
- 用戶體驗(yàn):
a.保證用戶登錄后,在較長(zhǎng)時(shí)間內(nèi)不需要重新登錄,比如15天或者30天內(nèi)登錄過(guò)就不需要讓用戶再主動(dòng)登錄。
b.支持多平臺(tái)登錄,用戶在App平臺(tái)上的登錄行為不會(huì)踢掉用戶在H5端的登錄狀態(tài)。
c.在同一平臺(tái)上,如果發(fā)生多設(shè)備登錄要能把老設(shè)備的登錄態(tài)踢掉。
- 安全性:
- 用戶認(rèn)證用的Token不可偽造,除發(fā)放Token的服務(wù)端外無(wú)法自行生成Token。
- Token 具有較快的過(guò)期機(jī)制(1~2 h),減少被人獲取Token后偽裝成用戶進(jìn)行操作的幾率。
- 能有發(fā)現(xiàn)機(jī)制,發(fā)現(xiàn)Token被竊取,或者客戶端存在舊Token未更新;
- 穩(wěn)定性:
- Token 具有自解釋性,即自帶某些信息,在某些極端惡劣情況下,依然能提供最基本的服務(wù)。
用戶認(rèn)證體系的實(shí)現(xiàn)思路和方案
為什么所有商用項(xiàng)目都需要用戶認(rèn)證體系呢?最簡(jiǎn)單的一個(gè)原因是:因?yàn)橛脩舻腎D不能外漏。在產(chǎn)品內(nèi)部與用戶相關(guān)的數(shù)據(jù)資產(chǎn)都是使用用戶ID標(biāo)記用戶歸屬的,一旦外漏造成的風(fēng)險(xiǎn)和損失不可預(yù)估。
在我們?cè)O(shè)計(jì)的認(rèn)證體系中,用戶登錄后返回給前端以下Token信息。
為什么有兩個(gè)Token
主要考慮下面三個(gè)因素:
- 一個(gè)Token即負(fù)責(zé)認(rèn)證又負(fù)責(zé)刷新,這種方式前端頁(yè)面會(huì)有并發(fā)請(qǐng)求的情況,Token 的刷新需要加鎖,會(huì)帶來(lái)很大的開(kāi)銷;
- 無(wú)法保證前端刷新 Token 的互斥時(shí),會(huì)出現(xiàn)Token反復(fù)失效的情況;
- 還有就是我們?cè)O(shè)計(jì)的refreshToken能幫助我們發(fā)現(xiàn)Token被盜和過(guò)期未更新的問(wèn)題
Token信息的構(gòu)成和存儲(chǔ)
服務(wù)端 Token 存儲(chǔ)的信息(服務(wù)端記錄的信息)如下:
用戶登錄授權(quán),在給用戶發(fā)放Token的同時(shí)服務(wù)端會(huì)存儲(chǔ)三份信息,用于會(huì)話管理和認(rèn)證。
圖片
它們存儲(chǔ)的主要信息和其存儲(chǔ)方式如下:
圖片
上面我們一直提到了用戶登錄平臺(tái)Platform、SessionId ,它們分別是什么呢?
- Platform:是我們自己定義的用戶登錄平臺(tái),比如H5、App、Web 之類的,用戶登錄時(shí)需要在Header頭中攜帶約定的Platform值,用于標(biāo)記用戶的不同登錄端。這個(gè)字段的設(shè)置是為了保證不同端的登錄和Token刷新相互之間不會(huì)受到影響,避免在App上刷新Token,導(dǎo)致H5 的用戶Token失效的問(wèn)題。
- SessionId:會(huì)話ID,登錄后的唯一標(biāo)識(shí),Token刷新時(shí)不會(huì)改變會(huì)話ID,仍然設(shè)置為原SessionId,只有在用戶重新登錄后SessionId才會(huì)改變,項(xiàng)目可以使用它記錄一些與登錄行為關(guān)聯(lián)的數(shù)據(jù)。
Token驗(yàn)證和刷新的流程
Token的驗(yàn)證和刷新流程給大家準(zhǔn)備了詳盡的UML活動(dòng)圖和案例進(jìn)行講解
圖片