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

用戶賬號密碼注冊或登錄,服務(wù)端用HMACSHA256根據(jù)secret和base64Url編碼后的header和payload進行加密生成signature,然后將base64Url編碼后的header和payload以及signature通過“.”相連接,最終形式xxxx.yyyy.zzzz(token),之后用戶每次請求資源的時候?qū)⒃L問令牌token放在請求頭中,服務(wù)端在驗證其是否有效之后,返回相對應(yīng)的資源信息。
header(標頭)
生成token的頭信息,通常由兩部分組成,包含令牌類型alg和所使用的簽名算法typ
{
"alg":"HS256",
"typ":"JWT"
}payload(有效負載)
通常包括生成jwt的非隱私信息,用戶的唯一標識符id,發(fā)行時間iat,到期時間exp
{
"id": "655c78ccd9107661e41abd9f",
"iat": 1702260106,
"exp": 1710036106
}signature(簽名)
HMAC-SHA256(Hash Message Authentication Code-Secure Hash Algorithm 256 bit)是一種加密算法,是SHA-256散列函數(shù)與一個密鑰結(jié)合的身份驗證方法。HMAC的安全性基于散列函數(shù)(SHA-256),而且可以通過密鑰的添加來增加信任度。此算法經(jīng)常用于網(wǎng)絡(luò)領(lǐng)域中,例如 HTTPS、SSL、SSH 等加密通訊領(lǐng)域。
生成signature:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret )
訪問令牌(token)
base64UrlEncode(header) + '.' + base64UrlEncode(payload) + '.' + signature
舉例:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY1NWM3OGNjZDkxMDc2NjFlNDFhYmQ5ZiIsImlhdCI6MTcwMjI2MDEwNiwiZXhwIjoxNzEwMDM2MTA2fQ.ca-J91WaThntP3IhMBQNps9MVqts8oi_f62KcV2r4D8
express jwt生成、驗證
1、安裝jsonwebtoken依賴,npm install jsonwebtoken --save
2、在代碼controller層引入依賴,在登錄、注冊的時候生成token
//環(huán)境變量,通過安裝dotenv依賴,在express入口文件中加載, 這么做的目的是不讓密鑰等敏感信息硬編碼在代碼中 JWT_SECRET=this-is-my-secret-password JWT_EXPIRES_IN=90d
生成jwt
// authController.js 用戶的登錄、注冊、密碼修改、token生成、權(quán)限校驗、憑證認證等
const jwt = require('jsonwebtoken');
const signToken = id => {
return jwt.sign({ id }, process.env.JWT_SECRET, {
expiresIn: process.env.JWT_EXPIRES_IN
});
};驗證jwt
promisify(jwt.verify)(token, process.env.JWT_SECRET);
const { promisify } = require('util');
// protect中間件, 用于驗證用戶
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('您還還沒有登錄或注冊', 401)
);
}
// 2) 驗證 token
const decoded = await promisify(jwt.verify)(token, process.env.JWT_SECRET);
// 驗證jwt是否有效,decode信息是payload,其中包含用戶生成jwt的id、iat、exp
// 通過這個唯一id可以查詢用戶信息,如果promisify是rejected則進行錯誤處理邏輯
});到此這篇關(guān)于node.js express JWT token生成與校驗的實現(xiàn)的文章就介紹到這了,更多相關(guān)express JWT token生成與校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pnpm實現(xiàn)依賴包共享和依賴包項目隔離的方法詳解
pnpm是Node.js的包管理器,它是 npm 的直接替代品,相對于npm和yarn它的優(yōu)點就在于速度快和高效節(jié)省磁盤空間,本文主要講解pnpm相比于npm/yarn如何利用軟硬鏈接來節(jié)省磁盤空間,以及如何實現(xiàn)依賴包共享和依賴包項目隔離的,需要的朋友可以參考下2024-05-05
node.js監(jiān)聽文件變化的實現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于node.js監(jiān)聽文件變化的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家學習或者使用node.js具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-04-04

