jwt在express中token的加密解密實現(xiàn)過程
在我們前面學習了 JWT認證機制在Node.js中的詳細闡述 之后,今天來詳細學習一下token是如何生成的,secret密鑰的加密解密過程是怎么樣的。
安裝依賴
- express:用于創(chuàng)建服務器
- jsonwebtoken:用于生成和驗證JWT
- body-parser:用于解析請求體中的數(shù)據(jù)
npm install express jsonwebtoken body-parser
設置密鑰
SECRET_KEY:用于簽名和驗證JWT的密鑰。請確保在生產(chǎn)環(huán)境中使用更安全的方式存儲密鑰。
// 密鑰(請確保在生產(chǎn)環(huán)境中使用更安全的方式存儲密鑰) const SECRET_KEY = 'your_secret_key';
中間件
bodyParser.json():解析請求體。
// 中間件:解析請求體
app.use(bodyParser.urlencoded({extended: false}))authenticateJWT:驗證JWT的中間件。如果驗證失敗,返回403狀態(tài)碼。
// 中間件:驗證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:模擬用戶注冊并生成JWT。
// 路由:注冊用戶(示例,僅用于生成token)
app.post('/register', (req, res) => {
const { username, password } = req.body;
// 在實際場景中,您應該驗證用戶并存儲其信息
// 這里僅假設用戶驗證成功
if (username && password) {
// 通過jwt.sign() 生成JWT字符串,
// 三個參數(shù)分別是:1-用戶信息對象(不要把密碼進行加密),2-加密密鑰,3-配置對象 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:受保護的路由,需要驗證JWT才能訪問。
// 路由:受保護的資源
app.get('/protected', authenticateJWT, (req, res) => {
res.json({
message: 'This is a protected route',
user: req.user
});
});運行服務器
服務器在3000端口運行,你可以通過http://localhost:3000訪問。
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;
// 密鑰(請確保在生產(chǎn)環(huán)境中使用更安全的方式存儲密鑰)
const SECRET_KEY = 'your_secret_key';
// 中間件:解析請求體
app.use(bodyParser.urlencoded({extended: false}))
// 路由:注冊用戶(示例,僅用于生成token)
app.post('/register', (req, res) => {
const { username, password } = req.body;
// 在實際場景中,您應該驗證用戶并存儲其信息
// 這里僅假設用戶驗證成功
if (username && password) {
// 通過jwt.sign() 生成JWT字符串,
// 三個參數(shù)分別是:1-用戶信息對象(不要把密碼進行加密),2-加密密鑰,3-配置對象 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' });
}
});
// 中間件:驗證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();
});
};
// 路由:受保護的資源
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進行token驗證之外,還可以使用 express-jwt 中間件。
在Express應用中,express-jwt(現(xiàn)在通常稱為express-jwt-ez,因為它是express-jwt的一個更現(xiàn)代、更輕量級的替代品)是一個中間件,用于驗證JWT(JSON Web Tokens)。它會自動從請求中提取JWT,并使用提供的密鑰或密鑰函數(shù)來解密(驗證)它。如果JWT有效,中間件會將解碼后的負載(payload)附加到請求對象上,以便后續(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\//] // 指定哪些路徑應該跳過JWT驗證(例如,生成token的端點和公共資源的端點)
}));需要注意的是,在使用此方法進行token校驗時,Authorization 的value指前面需要包含"Bearer "字符串。
完整代碼
const express = require('express');
const expressjwt = require('express-jwt');
const jwt = require('jsonwebtoken');
const app = express();
const port = 3000;
// 密鑰(請確保在生產(chǎn)環(huán)境中使用更安全的方式存儲密鑰)
const SECRET_KEY = 'your_secret_key_here';
// 中間件:解析請求體
app.use(bodyParser.urlencoded({extended: false}))
// 配置JWT中間件
app.use(expressjwt({
secret: SECRET_KEY,
algorithms: ['HS256'] // 指定用于簽名JWT的算法(這里使用的是HS256)
}).unless({
path: ['/generate-token', /^\/public\//] // 指定哪些路徑應該跳過JWT驗證(例如,生成token的端點和公共資源的端點)
}));
// 路由:生成JWT(這個端點不需要JWT驗證)
app.post('/generate-token', (req, res) => {
const { username } = req.body;
if (!username) {
return res.status(400).json({ message: 'Username is required' });
}
// 生成JWT(在實際應用中,你可能還會包含其他信息,如用戶ID、角色等)
const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });
res.json({
message: 'Token generated successfully',
token: token
});
});
// 路由:受保護的資源(這個端點需要JWT驗證)
app.get('/protected', (req, res) => {
// 如果JWT驗證成功,req.auth 將包含解碼后的負載(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}`);
});到此這篇關于jwt在express中token的加密解密實現(xiàn)方法的文章就介紹到這了,更多相關jwt express token加密解密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Node.js + express實現(xiàn)上傳大文件的方法分析【圖片、文本文件】
這篇文章主要介紹了Node.js + express實現(xiàn)上傳大文件的方法,結(jié)合實例形式分析了Node.js + express針對圖片、文本文件上傳操作實現(xiàn)方法及相關操作注意事項,需要的朋友可以參考下2019-03-03
Node.js如何響應Ajax的POST請求并且保存為JSON文件詳解
這篇文章主要介紹了關于Node.js是如何響應Ajax的POST請求并且保存為JSON文件的相關資料,文中介紹的很詳細,對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03
使用Nodejs編寫一個腳本實現(xiàn)markdown轉(zhuǎn)pdf功能
Markdown?是一種輕量級的標記語言,非常適合用來寫作和記錄,將?Markdown?轉(zhuǎn)換為?PDF?可以讓文檔在格式和樣式上更加統(tǒng)一,也方便在不同設備和平臺上查看和打印,在接下來的內(nèi)容中我們將講解如何使用?NodeJs?編寫一個?Markdown?轉(zhuǎn)?PDF?的腳本來實現(xiàn)我們這個想要的功能2024-05-05
Node.js開發(fā)教程之基于OnceIO框架實現(xiàn)文件上傳和驗證功能
這篇文章主要介紹了Node.js開發(fā)教程之基于OnceIO框架實現(xiàn)文件上傳和驗證的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-11-11

