目录
nodejs实现退出登录接口的逻辑,通常包括以下步骤:
- 安装必要的依赖
- 登录成功生成和返回 JWT。
- 在服务器端维护一个黑名单列表,记录已失效的 JWT。
- 在验证 JWT 时检查黑名单。
- 退出登录时将 JWT 添加到黑名单中。
1.安装必要的依赖
npm install express jsonwebtoken express-jwt body-parser
2.登录成功生成和返回 JWT
app.post('/login', (req, res) => {
// 验证用户名和密码
const { username, password } = req.body;
// 模拟登录成功,通常是要访问数据库的
if(username = 'admin' && password = 'admin'){
const token = jwt.sign({ username }, secret, { expiresIn: '1h' });
res.send({ code:0,msg: '登录成功',data:token });
}else{
res.status(401).send({ code:0,msg: '账户或密码错误' });
}
});
3.在服务器端维护一个黑名单列表,记录已失效的 JWT
const blacklistedTokens = [];
// 中间件:解析和验证 JWT
const authenticateJwt = expressJwt({
secret,
algorithms: ['HS256'],
isRevoked: (req, payload, done) => {
const token = req.headers['authorization'].split(' ')[1];
if (blacklistedTokens.includes(token)) {
return done(null, true); // token 已经失效
}
done();
}
});
4.在验证 JWT 时检查黑名单
isRevoked: (req, payload, done) => {
const token = req.headers['authorization'].split(' ')[1];
if (blacklistedTokens.includes(token)) {
return done(null, true); // token 已经失效
}
done();
}
5.退出登录时将 JWT 添加到黑名单中
// 退出登录路由,将 token 加入黑名单
app.post('/logout', (req, res) => {
if(!req.headers['authorization']) return res.status(401).send({
code:0,
msg:'请传入token'
})
const token = req.headers['authorization'].split(' ')[1];
// 添加到黑名单
blacklistedTokens.push(token);
res.send({ code:1,msg: '退出登录成功' });
});
完整代码
const express = require('express');
const jwt = require('jsonwebtoken');
const expressJwt = require('express-jwt');
const bodyParser = require('body-parser');
const app = express();
const port = 3000;
// 你的密钥
const secret = 'your_jwt_secret';
// token黑名单
const blacklistedTokens = [];
// 中间件:解析和验证 JWT
const authenticateJwt = expressJwt({
secret,
algorithms: ['HS256'],
isRevoked: (req, payload, done) => {
const token = req.headers['authorization'].split(' ')[1];
if (blacklistedTokens.includes(token)) {
return done(null, true); // token 已经失效
}
done();
}
});
// 使用 body-parser 中间件解析请求体
app.use(bodyParser.urlencoded({ extended: false }));
// 登录路由,生成token并返回
app.post('/login', (req, res) => {
// 验证用户名和密码
const { username, password } = req.body;
// 模拟登录成功,通常是要访问数据库的
if(username = 'admin' && password = 'admin'){
const token = jwt.sign({ username }, secret, { expiresIn: '1h' });
res.send({ code:0,msg: '登录成功',data:token });
}else{
res.status(401).send({ code:0,msg: '账户或密码错误' });
}
});
// 受保护的路由,需要 token 验证
app.get('/protected', authenticateJwt, (req, res) => {
res.send({code:1, msg: '这是一个受保护的路由', user: req.user });
});
// 退出登录路由,将 token 加入黑名单
app.post('/logout', (req, res) => {
if(!req.headers['authorization']) return res.status(401).send({
code:0,
msg:'请传入token'
})
const token = req.headers['authorization'].split(' ')[1];
// 添加到黑名单
blacklistedTokens.push(token);
res.send({ code:1,msg: '退出登录成功' });
});
// 错误处理
app.use((err, req, res, next) => {
if (err.name === 'UnauthorizedError') {
res.status(401).json(code:0,msg:'身份认证失败');
} else {
next(err);
}
});
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
标签:const,登录,nodejs,res,req,JWT,接口,token,黑名单
From: https://blog.csdn.net/m0_62442882/article/details/140266736