您好,登錄后才能下訂單哦!
一、痛點(diǎn)
隨著業(yè)務(wù)的發(fā)展,多個業(yè)務(wù)線接入了IM系統(tǒng),IM系統(tǒng)長連接的安全問題變得很重要。
瓜子有統(tǒng)一登錄認(rèn)證系統(tǒng)SSO,IM長連接通道也利用這個系統(tǒng)做安全認(rèn)證,結(jié)構(gòu)如下圖。
認(rèn)證步驟如下
1、用戶登錄App,App從業(yè)務(wù)后臺拿到單點(diǎn)系統(tǒng)SSO頒發(fā)的token
2、當(dāng)App需要使用IM功能時,將token傳給IM客服端SDK
3、SDK跟IM Server建立長連接的時候用token進(jìn)行認(rèn)證
4、IM Server請求SSO系統(tǒng),確認(rèn)token合法性
咋一看,這個過程沒有什么問題,但是IM(尤其是移動IM)業(yè)務(wù)的特殊性,這個結(jié)構(gòu)并不好。
手機(jī)(移動端)網(wǎng)絡(luò)很不穩(wěn)定,進(jìn)出地鐵可能斷網(wǎng),挪動位置也可能換基站。在一次聊天過程中,會經(jīng)常重新建立長連接,第3步會被頻繁執(zhí)行,進(jìn)而第4步也會頻繁執(zhí)行。(1)大大增加了SSO系統(tǒng)的壓力;(2)較長的鏈路帶來的延遲對用戶的體驗是一種傷害(SSO系統(tǒng)也可能短暫開小差)。
如果不通過第4步就能完成驗證,那這個痛點(diǎn)會得到極大緩解。我們想到了JWT技術(shù)。
二、什么是JWT?
官網(wǎng)上是這么定義JWT的。JSON Web Token(JWT)是一種開放標(biāo)準(zhǔn)(RFC 7519),它定義了一種緊湊且獨(dú)立的方式,可以在各方之間通過JSON對象安全地傳輸信息。此信息可以通過數(shù)字簽名進(jìn)行驗證和信任。 JWT可以使用密碼(使用HMAC算法)或使用RSA或ECDSA的公鑰/私鑰對進(jìn)行簽名。
JWT能做什么?
1、授權(quán)(Authorization)
這是JWT最常見的使用場景。一旦用戶登錄,后續(xù)每個請求將帶上JWT,就可以訪問該令牌(token)允許的路由,服務(wù)和資源。
JWT現(xiàn)在廣泛應(yīng)用于單點(diǎn)登錄,它開銷很小,并且能夠輕松跨域。
2、信息交換(Information Exchange)
JWT是在各方之間安全傳輸信息的好方法。因為JWT可以簽名(使用公鑰/私鑰對,簽名原理參看《你的HTTP接口簽名校驗做對了嗎?》)
您可以確定發(fā)件人的真實(shí)身份。此外,由于使用標(biāo)頭和payload計算簽名,您還可以驗證內(nèi)容是否未被篡改。
JWT數(shù)據(jù)結(jié)構(gòu)
JWT包含了使用“.”分隔的三部分: Header 頭部 Payload 負(fù)載 Signature 簽名
Header
在header中通常包含了兩部分:token類型和采用的加密算法。{ "alg": "HS256", "typ": "JWT"} 接下來對這部分內(nèi)容使用 Base64Url 編碼組成了JWT結(jié)構(gòu)的第一部分。
Payload
Token的第二部分是負(fù)載,它包含了claim, claim是一些實(shí)體(通常指的用戶)的狀態(tài)和額外的元數(shù)據(jù),有三種類型的claim:reserved, public 和 private.
Signature
Signature是對header和payload兩部分?jǐn)?shù)據(jù)簽名,通過指定的算法生成哈希,以確保數(shù)據(jù)不會被篡改。
更多關(guān)于JWT的資料參看
https://jwt.io/introduction/
三、怎么做驗證
采用JWT驗證長連接的流程如下
1、用戶登錄App,App從業(yè)務(wù)后臺拿到單點(diǎn)系統(tǒng)SSO頒發(fā)的token
2、當(dāng)App需要使用IM功能時,將token傳給IM客服端SDK
3、SDK將用戶名及第2步中得到的token發(fā)給后臺的JWT Server(簽發(fā)jwttoken的模塊),請求jwttoken。
4、JWT Server通過SSO系統(tǒng)驗證token的合法性,如果合法,用跟IM Server約定的公鑰/私鑰(或用對稱加密),根據(jù)業(yè)務(wù)需要簽發(fā)jwttoken,返回給IM Client SDK。
5、IM Client SDK使用得到的jwttoken請求IM Server驗證長連接。IM Server根據(jù)約定的算法(不依賴其他系統(tǒng))即可完成jwttoken合法性驗證。
頻繁建立長連接的驗證痛點(diǎn)得到解決。
四、缺點(diǎn)
1、JWT的最大缺點(diǎn)是服務(wù)器不保存會話狀態(tài),所以在使用期間不可能取消令牌或更改令牌的權(quán)限。也就是說,一旦JWT簽發(fā),在有效期內(nèi)將會一直有效。
2、JWT本身包含認(rèn)證信息,因此一旦信息泄露,任何人都可以獲得令牌的所有權(quán)限。為了減少盜用,JWT的有效期不宜設(shè)置太長。對于某些重要操作,用戶在使用時應(yīng)該每次都進(jìn)行進(jìn)行身份驗證。
3、為了減少盜用和竊取,JWT不建議使用HTTP協(xié)議來傳輸代碼,而是使用加密的HTTPS(SSL)協(xié)議進(jìn)行傳輸。
以下這個地址的文章寫了一些適用JWT的場景
https://www.jianshu.com/p/af8360b83a9f
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。