node.js express JWT token生成與校驗(yàn)的實(shí)現(xiàn)
JWT
JWT 是輕量級(jí)的數(shù)據(jù)交換格式,相對(duì)于傳統(tǒng)的 Session 機(jī)制,JWT 不需要在服務(wù)器端存儲(chǔ)會(huì)話信息,而是將所有必要的信息包含在令牌本身中。
生成驗(yàn)證流程

用戶賬號(hào)密碼注冊(cè)或登錄,服務(wù)端用HMACSHA256根據(jù)secret和base64Url編碼后的header和payload進(jìn)行加密生成signature,然后將base64Url編碼后的header和payload以及signature通過(guò)“.”相連接,最終形式xxxx.yyyy.zzzz(token),之后用戶每次請(qǐng)求資源的時(shí)候?qū)⒃L問(wèn)令牌token放在請(qǐng)求頭中,服務(wù)端在驗(yàn)證其是否有效之后,返回相對(duì)應(yīng)的資源信息。
header(標(biāo)頭)
生成token的頭信息,通常由兩部分組成,包含令牌類(lèi)型alg和所使用的簽名算法typ
{
"alg":"HS256",
"typ":"JWT"
}payload(有效負(fù)載)
通常包括生成jwt的非隱私信息,用戶的唯一標(biāo)識(shí)符id,發(fā)行時(shí)間iat,到期時(shí)間exp
{
"id": "655c78ccd9107661e41abd9f",
"iat": 1702260106,
"exp": 1710036106
}signature(簽名)
HMAC-SHA256(Hash Message Authentication Code-Secure Hash Algorithm 256 bit)是一種加密算法,是SHA-256散列函數(shù)與一個(gè)密鑰結(jié)合的身份驗(yàn)證方法。HMAC的安全性基于散列函數(shù)(SHA-256),而且可以通過(guò)密鑰的添加來(lái)增加信任度。此算法經(jīng)常用于網(wǎng)絡(luò)領(lǐng)域中,例如 HTTPS、SSL、SSH 等加密通訊領(lǐng)域。
生成signature:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )
訪問(wèn)令牌(token)
base64UrlEncode(header) + '.' + base64UrlEncode(payload) + '.' + signature
舉例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY1NWM3OGNjZDkxMDc2NjFlNDFhYmQ5ZiIsImlhdCI6MTcwMjI2MDEwNiwiZXhwIjoxNzEwMDM2MTA2fQ.ca-J91WaThntP3IhMBQNps9MVqts8oi_f62KcV2r4D8
express jwt生成、驗(yàn)證
1、安裝jsonwebtoken依賴,npm install jsonwebtoken --save
2、在代碼controller層引入依賴,在登錄、注冊(cè)的時(shí)候生成token
//環(huán)境變量,通過(guò)安裝dotenv依賴,在express入口文件中加載, 這么做的目的是不讓密鑰等敏感信息硬編碼在代碼中 JWT_SECRET=this-is-my-secret-password JWT_EXPIRES_IN=90d
生成jwt
// authController.js 用戶的登錄、注冊(cè)、密碼修改、token生成、權(quán)限校驗(yàn)、憑證認(rèn)證等
const jwt = require('jsonwebtoken');
const signToken = id => {
return jwt.sign({ id }, process.env.JWT_SECRET, {
expiresIn: process.env.JWT_EXPIRES_IN
});
};驗(yàn)證jwt
promisify(jwt.verify)(token, process.env.JWT_SECRET);
const { promisify } = require('util');
// protect中間件, 用于驗(yàn)證用戶
exports.protect = catchAsync(async (req, res, next) => {
let token;
if (
req.headers.authorization &&
req.headers.authorization.startsWith('Bearer')
) {
token = req.headers.authorization.split(' ')[1];
}
if (!token) {
return next(
new AppError('您還還沒(méi)有登錄或注冊(cè)', 401)
);
}
// 2) 驗(yàn)證 token
const decoded = await promisify(jwt.verify)(token, process.env.JWT_SECRET);
// 驗(yàn)證jwt是否有效,decode信息是payload,其中包含用戶生成jwt的id、iat、exp
// 通過(guò)這個(gè)唯一id可以查詢用戶信息,如果promisify是rejected則進(jìn)行錯(cuò)誤處理邏輯
});到此這篇關(guān)于node.js express JWT token生成與校驗(yàn)的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)express JWT token生成與校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
NodeJS學(xué)習(xí)筆記之Connect中間件模塊(一)
這是一個(gè)目錄概要,里面記錄著NodeJS的基礎(chǔ)知識(shí)部分,今天這篇文章以及后續(xù)的幾篇,將是一個(gè)進(jìn)階系列,讓我們建立一個(gè)由淺入深的學(xué)習(xí)的過(guò)程,2015-01-01
node?NPM庫(kù)promise?異步任務(wù)狀態(tài)管理
這篇文章主要介紹了node?NPM庫(kù)promise?異步任務(wù)狀態(tài)管理2023-07-07
nodejs開(kāi)發(fā)環(huán)境配置與使用
經(jīng)過(guò)幾個(gè)星期的nodejs學(xué)習(xí),從開(kāi)始的小白到現(xiàn)在漸漸得熟悉,走過(guò)來(lái)也才算明白,現(xiàn)在已經(jīng)入門(mén)也掌握了相關(guān)的學(xué)習(xí)方法,今天開(kāi)始記錄下自己學(xué)習(xí)的過(guò)程,以便日后查看。2014-11-11
win系統(tǒng)下nodejs環(huán)境安裝配置
這篇文章主要介紹了win系統(tǒng)下nodejs環(huán)境安裝配置的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05

