這篇文章主要講解了“nodejs中的jwt是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“nodejs中的jwt是什么”吧!
創(chuàng)新互聯(lián)是一家專業(yè)提供秦州企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、網(wǎng)站建設(shè)、H5開發(fā)、小程序制作等業(yè)務(wù)。10年已為秦州眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。
在nodejs中,jwt全稱Json web token,是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準。JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認證的用戶身份信息,以便于從資源服務(wù)器獲取資源。
本教程操作環(huán)境:windows7系統(tǒng)、nodejs 12.19.0版,DELL G3電腦。
nodejs中什么是JWT
Json web token (JWT), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開放標準((RFC 7519).該token被設(shè)計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景。
JWT的聲明一般被用來在身份提供者和服務(wù)提供者間傳遞被認證的用戶身份信息,以便于從資源服務(wù)器獲取資源,也可以增加一些額外的其它業(yè)務(wù)邏輯所必須的聲明信息,該token也可直接被用于認證,也可被加密。
我們知道HTTP通信是無狀態(tài)的,因此客戶端的請求到了服務(wù)端處理完之后是無法返回給原來的客戶端。因此需要對訪問的客戶端進行識別,常用的做法是通過session機制:客戶端在服務(wù)端登陸成功之后,服務(wù)端會生成一個sessionID,返回給客戶端,客戶端將sessionID保存到cookie中,再次發(fā)起請求的時候,攜帶cookie中的sessionID到服務(wù)端,服務(wù)端會緩存該session(會話),當(dāng)客戶端請求到來的時候,服務(wù)端就知道是哪個用戶的請求,并將處理的結(jié)果返回給客戶端,完成通信。
通過上面的分析,可以知道session存在以下問題:
1、session保存在服務(wù)端,當(dāng)客戶訪問量增加時,服務(wù)端就需要存儲大量的session會話,對服務(wù)器有很大的考驗;
2、當(dāng)服務(wù)端為集群時,用戶登陸其中一臺服務(wù)器,會將session保存到該服務(wù)器的內(nèi)存中,但是當(dāng)用戶的訪問到其他服務(wù)器時,會無法訪問,通常采用緩存一致性技術(shù)來保證可以共享,或者采用第三方緩存來保存session,不方便。
Json Web Token是怎么做的?
1、客戶端通過用戶名和密碼登錄服務(wù)器;
2、服務(wù)端對客戶端身份進行驗證;
3、服務(wù)端對該用戶生成Token,返回給客戶端;
4、客戶端將Token保存到本地瀏覽器,一般保存到cookie中;
5、客戶端發(fā)起請求,需要攜帶該Token;
6、服務(wù)端收到請求后,首先驗證Token,之后返回數(shù)據(jù)。
服務(wù)端不需要保存Token,只需要對Token中攜帶的信息進行驗證即可;
無論客戶端訪問后臺的那臺服務(wù)器,只要可以通過用戶信息的驗證即可。
Json Web Token長什么樣子呢?
通過名字就可以看出來,是一個json。
由三部分內(nèi)容組成:
頭(header),一般很少改動直接使用默認的即可:
{ ‘typ’:‘JWT’, ‘a(chǎn)lg’:‘HS256’ }
(playload),東西都裝在這里,默認的內(nèi)容有:
{ ‘iss’:‘簽發(fā)者’, ‘sub’:‘面向的用戶’, ‘a(chǎn)ud’:‘接收方’, ‘exp’: 過期時間, ‘iat’: 創(chuàng)建時間, ‘nbf’: 在什么時間之前,該Token不可用, ‘jti’:‘Token唯一標識’ }
根據(jù)需要用戶可以自己定義,Token中傳輸?shù)膬?nèi)容,一般會將用戶名,角色等信息放到Token中。
(signature),前面兩部分轉(zhuǎn)為字符串后,使用base64編碼,然后進行加密得到一個字符串。
Token = header(base64)+ playload(base64)+ signature;
實現(xiàn)流程
–>用戶登錄,服務(wù)器產(chǎn)生一個token(加密字符串)發(fā)送給前端,
–>前端將token保存(想存哪就存哪)
–>前端發(fā)起數(shù)據(jù)請求時攜帶token
–>服務(wù)端驗證token是否合法,合法繼續(xù)操作,不合法終止操作
token的使用場景:無狀態(tài)請求,保持用戶的登錄狀態(tài),第三方登錄(token+auth3.0)
支持算法
alg參數(shù)值 | 數(shù)字簽名或MAC算法 |
---|---|
HS256 | 使用SHA-256哈希算法的HMAC |
HS384 | 使用SHA-384哈希算法的HMAC |
HS512 | 使用SHA-512哈希算法的HMAC |
RS256 | 使用SHA-256哈希算法的RSASSA-PKCS1-v1_5 |
RS384 | 使用SHA-384哈希算法的RSASSA-PKCS1-v1_5 |
RS512 | 使用SHA-512哈希算法的RSASSA-PKCS1-v1_5 |
PS256 | 使用SHA-256哈希算法的RSASSA-PSS(僅節(jié)點^ 6.12.0 OR> = 8.0.0) |
PS384 | 使用SHA-384哈希算法的RSASSA-PSS(僅節(jié)點^ 6.12.0 OR> = 8.0.0) |
PS512 | 使用SHA-512哈希算法的RSASSA-PSS(僅節(jié)點^ 6.12.0 OR> = 8.0.0) |
ES256 | 使用P-256曲線和SHA-256哈希算法的ECDSA |
ES384 | 使用P-384曲線和SHA-384哈希算法的ECDSA |
ES512 | 使用P-521曲線和SHA-512哈希算法的ECDSA |
沒有 | 不包含數(shù)字簽名或MAC值 |
開發(fā)時使用
安裝
npm install jsonwebtoken --save
使用
const jwt = require('jsonwebtoken');//加載包 //產(chǎn)生token默認算法hs256 let token=jwt.sign({user:'123'},'123114655sad46aa');//此方法接收兩個參數(shù),第一個是要加密保存的數(shù)據(jù)(一個對象,不要放隱秘性的數(shù)據(jù),如密碼),第二個是要加密的私鑰(一個字符串,越亂越好) console.log(token);//返回一個加密字符串 // 服務(wù)器簽發(fā)的token //eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiMTIzIiwiaWF0IjoxNTcwMDc2NjU5fQ.3FT6v8zVptdWGBILD1m1CRY6sCP1I3E947krUh_E3 //客戶端請求數(shù)據(jù)的時候驗證token //客戶端傳遞過來的token let tokens=token; jwt.verify(tokens,'123114655sad46aa',function (err,data) { //verify接收兩個參數(shù),第一個參數(shù)是客戶端傳遞過來的token,第二個參數(shù)是加密時的私鑰;第三個參數(shù)是回調(diào)函數(shù) console.log(err);//簽名通過返回null,簽名不通過返回err(JsonWebTokenError: invalid signature) console.log(data);// 通過返回解密數(shù)據(jù),失敗返回unfinished });
感謝各位的閱讀,以上就是“nodejs中的jwt是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對nodejs中的jwt是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!