騰訊工作心得:統(tǒng)一登錄的幾種常用設(shè)計(jì)模式
編輯導(dǎo)語(yǔ):很多時(shí)候我們都會(huì)遇到需要登陸的情況,特別是在系統(tǒng)設(shè)計(jì)中,我們常遇到統(tǒng)一登錄問(wèn)題,比如在公司的多種項(xiàng)目上;統(tǒng)一登陸需要注意哪些要點(diǎn),有什么設(shè)計(jì)方法?本文作者介紹了統(tǒng)一登錄服務(wù)需要考慮的點(diǎn)和幾種常用的設(shè)計(jì)模式,我們一起來(lái)看一下。
在公司內(nèi)部,如果有多個(gè)項(xiàng)目,每個(gè)項(xiàng)目都有登錄,并且多個(gè)項(xiàng)目想要共用一套賬戶體系時(shí),一般都會(huì)設(shè)計(jì)一個(gè)統(tǒng)一登錄服務(wù)來(lái)實(shí)現(xiàn)業(yè)務(wù)快速接入。
下面講下做一個(gè)統(tǒng)一登錄服務(wù)需要考慮的點(diǎn)和幾種常用的設(shè)計(jì)模式:
一、需要具備的基本要素
注:下文的業(yè)務(wù)側(cè)指需要接入統(tǒng)一登錄的業(yè)務(wù)方。
一個(gè)統(tǒng)一登錄的登錄流程:攜帶參數(shù)發(fā)起登錄 -> 統(tǒng)一登錄認(rèn)證 -> 重定向業(yè)務(wù)后端地址 -> 業(yè)務(wù)側(cè)注入登錄態(tài) -> 業(yè)務(wù)側(cè)重定向到前端頁(yè)面。
從登錄流程可以看出幾個(gè)核心要點(diǎn):
1. 統(tǒng)一登錄認(rèn)證
按道理統(tǒng)一登錄服務(wù),不是隨隨便便一個(gè)業(yè)務(wù)都能接入的;比如公司外部的 惡意方堅(jiān)決不能讓它接入,所以統(tǒng)一登錄必須要有來(lái)源的認(rèn)證。
需要接入的業(yè)務(wù)方,一般會(huì)給它分配appId和appSecret,appId用于識(shí)別業(yè)務(wù),比如appId=1表示是采購(gòu)平臺(tái),appId=2表示是審核平臺(tái)。
appSecret是業(yè)務(wù)方秘鑰,業(yè)務(wù)方需要使用密鑰通過(guò)算法計(jì)算簽名,只有統(tǒng)一登錄服務(wù)才能解出這個(gè)簽名,從而識(shí)別出是信任授權(quán)應(yīng)用,應(yīng)用認(rèn)證才能通過(guò)。
當(dāng)應(yīng)用認(rèn)證通過(guò)后,開(kāi)始校驗(yàn)用戶,如果是新用戶注冊(cè),就把業(yè)務(wù)appId和用戶信息寫(xiě)入數(shù)據(jù)庫(kù);如果是老用戶則直接校驗(yàn)數(shù)據(jù)庫(kù)數(shù)據(jù),用戶校驗(yàn)成功后,整個(gè)認(rèn)證成功。
2. 認(rèn)證成功后的跳轉(zhuǎn)
當(dāng)認(rèn)證成功后,統(tǒng)一服務(wù)會(huì)發(fā)起業(yè)務(wù)側(cè)url跳轉(zhuǎn)。
上面說(shuō)的業(yè)務(wù)方攜帶參數(shù)發(fā)起登錄,這里的參數(shù)一般都有哪些呢?
appId、簽名、用戶信息、個(gè)性化數(shù)據(jù)、重定向地址 (appId和簽名上面已經(jīng)說(shuō)明用途)。
重定向地址用于認(rèn)證成功后的業(yè)務(wù)跳轉(zhuǎn),一般是業(yè)務(wù)端的后臺(tái)地址,統(tǒng)一登錄會(huì)把用戶的信息透?jìng)鹘o業(yè)務(wù)側(cè),業(yè)務(wù)側(cè)一般會(huì)做:登錄態(tài)注入相應(yīng)的業(yè)務(wù)域名和做一些用戶數(shù)據(jù)初始化的操作。
個(gè)性化數(shù)據(jù)有什么用?當(dāng)你訪問(wèn)一個(gè)頁(yè)面時(shí),登錄態(tài)失效后會(huì)自動(dòng)退出到登錄頁(yè)面,當(dāng)再次登錄成功時(shí),按道理最好是跳轉(zhuǎn)到當(dāng)初退出時(shí)的具體頁(yè)面。
個(gè)性化數(shù)據(jù)就是用于存放這個(gè)登錄退出前的前端頁(yè)面地址,統(tǒng)一登錄會(huì)透?jìng)鬟@個(gè)個(gè)性化數(shù)據(jù)到業(yè)務(wù)側(cè),業(yè)務(wù)側(cè)注入登錄態(tài)成功后,會(huì)跳轉(zhuǎn)到這個(gè)前端頁(yè)面。
當(dāng)然個(gè)性化數(shù)據(jù)還可以放置其他的一些業(yè)務(wù)側(cè)數(shù)據(jù)。
3. 異常處理
統(tǒng)一登錄的過(guò)程可能會(huì)有以下的異常,要注意做好錯(cuò)誤碼和錯(cuò)誤提示的返回。
- 應(yīng)用未登記指的是業(yè)務(wù)側(cè)沒(méi)有獲取統(tǒng)一登錄服務(wù)授權(quán)的appId和appSecret;
- 用戶已存在指的是數(shù)據(jù)庫(kù)里已經(jīng)存在同一個(gè)用戶;
- 用戶注冊(cè)信息不合法;
- 認(rèn)證超時(shí);
統(tǒng)一登錄的登錄認(rèn)證一般都會(huì)做 “防重放” 的防御,意思就是業(yè)務(wù)側(cè)發(fā)送的簽名是有有效期的(有效期一般按秒計(jì)算),是為了防止惡意用戶利用算好的簽名重復(fù)多次登錄。
二、設(shè)計(jì)模式
1. 直接域名
統(tǒng)一登錄平臺(tái)直接提供一個(gè)統(tǒng)一登錄域名,當(dāng)?shù)卿洃B(tài)失效時(shí),業(yè)務(wù)側(cè)重定向到統(tǒng)一登錄地址。
這種模式比較適用于公司內(nèi)部的業(yè)務(wù)平臺(tái)。這種模式的缺點(diǎn)是靈活性低,根據(jù)具體業(yè)務(wù)做相應(yīng)的UI定制化比較麻煩。
2. js-sdk
sdk的方式比較靈活,其實(shí)是把登錄的前端邏輯都封裝在一個(gè)js-sdk當(dāng)中,包括UI、發(fā)起登錄請(qǐng)求等事件;需要接入的業(yè)務(wù)側(cè),只要引入這個(gè)sdk就可以使用。
js-sdk一個(gè)比較好的優(yōu)點(diǎn)是,在用戶引用它時(shí),它可以把登錄界面以iframe的形式嵌入到業(yè)務(wù)頁(yè)面當(dāng)中,可以自定義滿足一些業(yè)務(wù)登錄界面的個(gè)性化需求,比如a業(yè)務(wù)的登錄界面需要放置宣傳a業(yè)務(wù)的產(chǎn)品信息,可自定義登錄信息框的位置。
而且js-sdk還可以提供改變登錄樣式的接口,可以讓業(yè)務(wù)根據(jù)需求做些樣式調(diào)整,比如更改統(tǒng)一登錄信息框的背景圖、字體、間距等。
微信統(tǒng)一登錄也是使用的這種模式,這種模式適用于開(kāi)放型平臺(tái)的第三方登錄
3. 網(wǎng)關(guān)
什么是網(wǎng)關(guān)?
大家都知道,從一個(gè)房間走到另一個(gè)房間,必然要經(jīng)過(guò)一扇門(mén)。同樣,從一個(gè)網(wǎng)絡(luò)向另一個(gè)網(wǎng)絡(luò)發(fā)送信息,也必須經(jīng)過(guò)一道“關(guān)口”,這道關(guān)口就是網(wǎng)關(guān)。
網(wǎng)關(guān)方式和上面兩種不一樣的地方是,它登錄態(tài)的注入域名是固定的,一般是多個(gè)子域名共用父域下的登錄態(tài)。
舉個(gè)例子,a.oa.com和b.oa.com2個(gè)業(yè)務(wù)平臺(tái)的域名共用父域.oa.com下的登錄態(tài)。
網(wǎng)關(guān)的方式比較適合公司內(nèi)部的公共資源平臺(tái)鑒權(quán)。
比如公司內(nèi)部的oa系統(tǒng)、資源學(xué)習(xí)平臺(tái)、用戶信息平臺(tái),在訪問(wèn)公司內(nèi)網(wǎng)平臺(tái)時(shí)會(huì)經(jīng)過(guò)公司網(wǎng)關(guān),統(tǒng)一登錄服務(wù)在網(wǎng)關(guān)這一層就做了攔截校驗(yàn);其一是校驗(yàn)該業(yè)務(wù)是否接入了網(wǎng)關(guān)登錄服務(wù),其二是校驗(yàn)是否有登錄態(tài),如果沒(méi)有則在網(wǎng)關(guān)層就直接重定向到統(tǒng)一登錄地址。
這是最簡(jiǎn)單的設(shè)計(jì)模式,業(yè)務(wù)側(cè)只需要登記接入網(wǎng)關(guān)服務(wù)信息就可以使用,不需要像其他模式一樣還要引入sdk或者做重定向;缺點(diǎn)是沒(méi)法滿足業(yè)務(wù)定制化需求,比如定制化的UI登錄界面,登錄成功后業(yè)務(wù)側(cè)的業(yè)務(wù)初始化操作,登錄態(tài)父域名是固定的。
前百度前端工程師,現(xiàn)騰訊前端工程師,公眾號(hào):產(chǎn)品的技術(shù)小課。
本文由 @lemon 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載。
題圖來(lái)自?Unsplash,基于 CC0 協(xié)議
可以介紹下騰訊的項(xiàng)目流程和產(chǎn)品工作么