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實(shí)現(xiàn)學(xué)生檔案管理
這篇文章主要為大家詳細(xì)介紹了node.js實(shí)現(xiàn)學(xué)生檔案管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
NodeJS落地WebSocket實(shí)踐前端架構(gòu)師破局技術(shù)
這篇文章主要為大家介紹了NodeJS落地WebSocket實(shí)踐前端架構(gòu)師破局技術(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
nodejs實(shí)現(xiàn)的連接MySQL數(shù)據(jù)庫(kù)功能示例
這篇文章主要介紹了nodejs實(shí)現(xiàn)的連接MySQL數(shù)據(jù)庫(kù)功能,結(jié)合實(shí)例形式分析了nodejs連接及查詢mysql數(shù)據(jù)的相關(guān)操作步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-01-01
nodejs實(shí)現(xiàn)百度輿情接口應(yīng)用示例
這篇文章主要介紹了nodejs實(shí)現(xiàn)百度輿情接口應(yīng)用,結(jié)合實(shí)例形式分析了node.js調(diào)用百度輿情接口的具體使用技巧,需要的朋友可以參考下2020-02-02
Express框架搭建項(xiàng)目的實(shí)現(xiàn)步驟
Express是一個(gè)基于Node.js平臺(tái)的輕量級(jí)Web應(yīng)用框架,它提供了簡(jiǎn)潔的API和豐富的功能,本文主要介紹了Express框架搭建項(xiàng)目的實(shí)現(xiàn)步驟,感興趣的可以了解一下2024-06-06
如何用Node.js編寫(xiě)內(nèi)存效率高的應(yīng)用程序
這篇文章主要介紹了如何用Node.js編寫(xiě)內(nèi)存效率高的應(yīng)用程序,對(duì)Node.js感興趣的同學(xué),可以參考下2021-04-04
Node.js斷點(diǎn)續(xù)傳的實(shí)現(xiàn)
最近做了個(gè)項(xiàng)目,應(yīng)項(xiàng)目需求,需要傳圖片、Excel等,幾M的大小可以很快就上傳到服務(wù)器,但是大的就需要斷點(diǎn)上傳,本文就介紹一下,感興趣的可以了解一下2021-05-05

