jwt在express中token的加密解密實(shí)現(xiàn)過(guò)程
在我們前面學(xué)習(xí)了 JWT認(rèn)證機(jī)制在Node.js中的詳細(xì)闡述 之后,今天來(lái)詳細(xì)學(xué)習(xí)一下token是如何生成的,secret密鑰的加密解密過(guò)程是怎么樣的。
安裝依賴
- express:用于創(chuàng)建服務(wù)器
- jsonwebtoken:用于生成和驗(yàn)證JWT
- body-parser:用于解析請(qǐng)求體中的數(shù)據(jù)
npm install express jsonwebtoken body-parser
設(shè)置密鑰
SECRET_KEY:用于簽名和驗(yàn)證JWT的密鑰。請(qǐng)確保在生產(chǎn)環(huán)境中使用更安全的方式存儲(chǔ)密鑰。
// 密鑰(請(qǐng)確保在生產(chǎn)環(huán)境中使用更安全的方式存儲(chǔ)密鑰) const SECRET_KEY = 'your_secret_key';
中間件
bodyParser.json():解析請(qǐng)求體。
// 中間件:解析請(qǐng)求體
app.use(bodyParser.urlencoded({extended: false}))authenticateJWT:驗(yàn)證JWT的中間件。如果驗(yàn)證失敗,返回403狀態(tài)碼。
// 中間件:驗(yàn)證JWT
const authenticateJWT = (req, res, next) => {
const token = req.headers.authorization;
if (!token) {
return res.sendStatus(403);
}
jwt.verify(token, SECRET_KEY, (err, user) => {
if (err) {
return res.sendStatus(403);
}
console.log(user, 'user')
req.user = user;
next();
});
};路由
/register:模擬用戶注冊(cè)并生成JWT。
// 路由:注冊(cè)用戶(示例,僅用于生成token)
app.post('/register', (req, res) => {
const { username, password } = req.body;
// 在實(shí)際場(chǎng)景中,您應(yīng)該驗(yàn)證用戶并存儲(chǔ)其信息
// 這里僅假設(shè)用戶驗(yàn)證成功
if (username && password) {
// 通過(guò)jwt.sign() 生成JWT字符串,
// 三個(gè)參數(shù)分別是:1-用戶信息對(duì)象(不要把密碼進(jìn)行加密),2-加密密鑰,3-配置對(duì)象 expiresIn-配置token有效期
const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });
res.json({
message: 'User registered successfully',
token: token
});
} else {
res.status(400).json({ message: 'Invalid credentials' });
}
});/protected:受保護(hù)的路由,需要驗(yàn)證JWT才能訪問(wèn)。
// 路由:受保護(hù)的資源
app.get('/protected', authenticateJWT, (req, res) => {
res.json({
message: 'This is a protected route',
user: req.user
});
});運(yùn)行服務(wù)器
服務(wù)器在3000端口運(yùn)行,你可以通過(guò)http://localhost:3000訪問(wèn)。
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});效果


完整代碼
const express = require('express');
const jwt = require('jsonwebtoken');
const bodyParser = require('body-parser');
const app = express();
const port = 3000;
// 密鑰(請(qǐng)確保在生產(chǎn)環(huán)境中使用更安全的方式存儲(chǔ)密鑰)
const SECRET_KEY = 'your_secret_key';
// 中間件:解析請(qǐng)求體
app.use(bodyParser.urlencoded({extended: false}))
// 路由:注冊(cè)用戶(示例,僅用于生成token)
app.post('/register', (req, res) => {
const { username, password } = req.body;
// 在實(shí)際場(chǎng)景中,您應(yīng)該驗(yàn)證用戶并存儲(chǔ)其信息
// 這里僅假設(shè)用戶驗(yàn)證成功
if (username && password) {
// 通過(guò)jwt.sign() 生成JWT字符串,
// 三個(gè)參數(shù)分別是:1-用戶信息對(duì)象(不要把密碼進(jìn)行加密),2-加密密鑰,3-配置對(duì)象 expiresIn-配置token有效期
const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });
res.json({
message: 'User registered successfully',
token: token
});
} else {
res.status(400).json({ message: 'Invalid credentials' });
}
});
// 中間件:驗(yàn)證JWT
const authenticateJWT = (req, res, next) => {
console.log(req.headers, 'req.headers')
const token = req.headers.authorization;
if (!token) {
return res.sendStatus(403);
}
console.log(token, 'token')
jwt.verify(token, SECRET_KEY, (err, user) => {
if (err) {
return res.sendStatus(403);
}
console.log(user, 'user')
req.user = user;
next();
});
};
// 路由:受保護(hù)的資源
app.get('/protected', authenticateJWT, (req, res) => {
res.json({
message: 'This is a protected route',
user: req.user
});
});
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});除了 jwt.verify進(jìn)行token驗(yàn)證之外,還可以使用 express-jwt 中間件。
在Express應(yīng)用中,express-jwt(現(xiàn)在通常稱為express-jwt-ez,因?yàn)樗莈xpress-jwt的一個(gè)更現(xiàn)代、更輕量級(jí)的替代品)是一個(gè)中間件,用于驗(yàn)證JWT(JSON Web Tokens)。它會(huì)自動(dòng)從請(qǐng)求中提取JWT,并使用提供的密鑰或密鑰函數(shù)來(lái)解密(驗(yàn)證)它。如果JWT有效,中間件會(huì)將解碼后的負(fù)載(payload)附加到請(qǐng)求對(duì)象上,以便后續(xù)的處理程序(handler)可以使用。
安裝express-jwt
npm install express-jwt
配置JWT中間件
// 配置JWT中間件
app.use(jwt({
secret: SECRET_KEY,
algorithms: ['HS256'] // 指定用于簽名JWT的算法(這里使用的是HS256)
}).unless({
path: ['/generate-token', /^\/public\//] // 指定哪些路徑應(yīng)該跳過(guò)JWT驗(yàn)證(例如,生成token的端點(diǎn)和公共資源的端點(diǎn))
}));需要注意的是,在使用此方法進(jìn)行token校驗(yàn)時(shí),Authorization 的value指前面需要包含"Bearer "字符串。
完整代碼
const express = require('express');
const expressjwt = require('express-jwt');
const jwt = require('jsonwebtoken');
const app = express();
const port = 3000;
// 密鑰(請(qǐng)確保在生產(chǎn)環(huán)境中使用更安全的方式存儲(chǔ)密鑰)
const SECRET_KEY = 'your_secret_key_here';
// 中間件:解析請(qǐng)求體
app.use(bodyParser.urlencoded({extended: false}))
// 配置JWT中間件
app.use(expressjwt({
secret: SECRET_KEY,
algorithms: ['HS256'] // 指定用于簽名JWT的算法(這里使用的是HS256)
}).unless({
path: ['/generate-token', /^\/public\//] // 指定哪些路徑應(yīng)該跳過(guò)JWT驗(yàn)證(例如,生成token的端點(diǎn)和公共資源的端點(diǎn))
}));
// 路由:生成JWT(這個(gè)端點(diǎn)不需要JWT驗(yàn)證)
app.post('/generate-token', (req, res) => {
const { username } = req.body;
if (!username) {
return res.status(400).json({ message: 'Username is required' });
}
// 生成JWT(在實(shí)際應(yīng)用中,你可能還會(huì)包含其他信息,如用戶ID、角色等)
const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });
res.json({
message: 'Token generated successfully',
token: token
});
});
// 路由:受保護(hù)的資源(這個(gè)端點(diǎn)需要JWT驗(yàn)證)
app.get('/protected', (req, res) => {
// 如果JWT驗(yàn)證成功,req.auth 將包含解碼后的負(fù)載(payload)
const { username } = req.auth;
res.json({
message: 'This is a protected route',
user: {
username: username
}
});
});
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});到此這篇關(guān)于jwt在express中token的加密解密實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)jwt express token加密解密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Node.js + express實(shí)現(xiàn)上傳大文件的方法分析【圖片、文本文件】
這篇文章主要介紹了Node.js + express實(shí)現(xiàn)上傳大文件的方法,結(jié)合實(shí)例形式分析了Node.js + express針對(duì)圖片、文本文件上傳操作實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-03-03
nodejs multer實(shí)現(xiàn)文件上傳與下載
這篇文章主要為大家詳細(xì)介紹了nodejs multer實(shí)現(xiàn)文件上傳與下載的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
node連接mysql查詢事務(wù)處理的實(shí)現(xiàn)
本文主要介紹了node連接mysql查詢事務(wù)處理的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Node.js如何響應(yīng)Ajax的POST請(qǐng)求并且保存為JSON文件詳解
這篇文章主要介紹了關(guān)于Node.js是如何響應(yīng)Ajax的POST請(qǐng)求并且保存為JSON文件的相關(guān)資料,文中介紹的很詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03
Node.js同時(shí)安裝多個(gè)版本及相關(guān)配置指南(簡(jiǎn)單易操作)
在實(shí)際開(kāi)發(fā)過(guò)程中我們可能需要安裝多個(gè)版本的 nodejs,下面這篇文章主要給大家介紹了關(guān)于Node.js同時(shí)安裝多個(gè)版本及相關(guān)配置的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
使用Nodejs編寫(xiě)一個(gè)腳本實(shí)現(xiàn)markdown轉(zhuǎn)pdf功能
Markdown?是一種輕量級(jí)的標(biāo)記語(yǔ)言,非常適合用來(lái)寫(xiě)作和記錄,將?Markdown?轉(zhuǎn)換為?PDF?可以讓文檔在格式和樣式上更加統(tǒng)一,也方便在不同設(shè)備和平臺(tái)上查看和打印,在接下來(lái)的內(nèi)容中我們將講解如何使用?NodeJs?編寫(xiě)一個(gè)?Markdown?轉(zhuǎn)?PDF?的腳本來(lái)實(shí)現(xiàn)我們這個(gè)想要的功能2024-05-05
Node.js開(kāi)發(fā)教程之基于OnceIO框架實(shí)現(xiàn)文件上傳和驗(yàn)證功能
這篇文章主要介紹了Node.js開(kāi)發(fā)教程之基于OnceIO框架實(shí)現(xiàn)文件上傳和驗(yàn)證的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11

