node中jwt(json web token)的使用

在這裏插入圖片描述

node中jwt的使用

Json Web Token 簡介

1、Json Web Token是幹什麼
簡稱JWT,在HTTP通信過程中,進行身份認證。
我們知道HTTP通信是無狀態的,因此客戶端的請求到了服務端處理完之後是無法返回給原來的客戶端。因此需要對訪問的客戶端進行識別,常用的做法是通過session機制:客戶端在服務端登陸成功之後,服務端會生成一個sessionID,返回給客戶端,客戶端將sessionID保存到cookie中,再次發起請求的時候,攜帶cookie中的sessionID到服務端,服務端會緩存該session(會話),當客戶端請求到來的時候,服務端就知道是哪個用戶的請求,並將處理的結果返回給客戶端,完成通信。
通過上面的分析,可以知道session存在以下問題:
1、session保存在服務端,當客戶訪問量增加時,服務端就需要存儲大量的session會話,對服務器有很大的考驗;
2、當服務端爲集羣時,用戶登陸其中一臺服務器,會將session保存到該服務器的內存中,但是當用戶的訪問到其他服務器時,會無法訪問,通常採用緩存一致性技術來保證可以共享,或者採用第三方緩存來保存session,不方便。

2、Json Web Token是怎麼做的?
1、客戶端通過用戶名和密碼登錄服務器;
2、服務端對客戶端身份進行驗證;
3、服務端對該用戶生成Token,返回給客戶端;
4、客戶端將Token保存到本地瀏覽器,一般保存到cookie中;
5、客戶端發起請求,需要攜帶該Token;
6、服務端收到請求後,首先驗證Token,之後返回數據。
服務端不需要保存Token,只需要對Token中攜帶的信息進行驗證即可;
無論客戶端訪問後臺的那臺服務器,只要可以通過用戶信息的驗證即可。

3、Json Web Token長什麼樣子呢?
通過名字就可以看出來,是一個json。
由三部分內容組成:
頭(header),一般很少改動直接使用默認的即可:
{
‘typ’:‘JWT’,
‘alg’:‘HS256’
}
(playload),東西都裝在這裏,默認的內容有:
{
‘iss’:‘簽發者’,
‘sub’:‘面向的用戶’,
‘aud’:‘接收方’,
‘exp’: 過期時間,
‘iat’: 創建時間,
‘nbf’: 在什麼時間之前,該Token不可用,
‘jti’:‘Token唯一標識’
}
根據需要用戶可以自己定義,Token中傳輸的內容,一般會將用戶名,角色等信息放到Token中。
(signature),前面兩部分轉爲字符串後,使用base64編碼,然後進行加密得到一個字符串。
Token = header(base64)+ playload(base64)+ signature;

在這裏插入圖片描述

實現流程

–>用戶登錄,服務器產生一個token(加密字符串)發送給前端,

–>前端將token保存(想存哪就存哪)

–>前端發起數據請求時攜帶token

–>服務端驗證token是否合法,合法繼續操作,不合法終止操作

token的使用場景:無狀態請求,保持用戶的登錄狀態,第三方登錄(token+auth2.0)

支持算法
alg參數值 數字簽名或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(僅節點^ 6.12.0 OR> = 8.0.0)
PS384 使用SHA-384哈希算法的RSASSA-PSS(僅節點^ 6.12.0 OR> = 8.0.0)
PS512 使用SHA-512哈希算法的RSASSA-PSS(僅節點^ 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
沒有 不包含數字簽名或MAC值

開發時使用

安裝

npm install jsonwebtoken --save

使用

const jwt = require('jsonwebtoken');//加載包
//產生token默認算法hs256
let token=jwt.sign({user:'123'},'123114655sad46aa');//此方法接收兩個參數,第一個是要加密保存的數據(一個對象,不要放隱祕性的數據,如密碼),第二個是要加密的私鑰(一個字符串,越亂越好)
console.log(token);//返回一個加密字符串
// 服務器簽發的token
//eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjoiMTIzIiwiaWF0IjoxNTcwMDc2NjU5fQ.3FT6v8zVptdWGBILD1m1CRY6sCP1I3E947krUh_E3



//客戶端請求數據的時候驗證token
//客戶端傳遞過來的token
let tokens=token;

jwt.verify(tokens,'123114655sad46aa',function (err,data) {
    //verify接收兩個參數,第一個參數是客戶端傳遞過來的token,第二個參數是加密時的私鑰;第三個參數是回調函數
    console.log(err);//簽名通過返回null,簽名不通過返回err(JsonWebTokenError: invalid signature)	
    console.log(data);//	通過返回解密數據,失敗返回unfinished
});

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章