在当今企业级开发中,Token认证机制已经成为了保护API安全的行业标准。今天,我们将通过实战演练,手把手教你如何利用Node.js生成JSON Web Token(JWT),并结合Redis缓存,实现一套高效、安全的认证流程。
首先,我们需要安装以下工具库:
使用以下命令安装这些库:
npm install express jsonwebtoken ioredis dotenv mysql2 sequelize
在项目根目录下创建.env
文件,并在app.js
中配置dotenv
:
require('dotenv').config();
这样,我们就可以在项目中自定义的文件中获取.env
文件中配置的数据了,例如:
const REDIS_PORT = process.env.REDIS_PORT;
Redis是一个高性能的键值存储数据库,常用于缓存、消息队列、会话存储等场景。在Node.js中使用Redis可以显著提升应用性能。
首先,安装Redis服务端:
npm install redis
然后,在config
文件夹下创建redis.js
文件,将创建好的Redis配置文件加载到app.js
中:
const Redis = require('ioredis');
const redisConfig = require('./redis.config');
const redisClient = new Redis(redisConfig);
module.exports = redisClient;
在redis.config.js
文件中配置Redis连接信息:
module.exports = {
host: process.env.REDIS_HOST,
port: process.env.REDIS_PORT,
};
JWT是一种具体的Token实现方式,是一种认证解决方案。我们可以使用jsonwebtoken
库的sign
方法生成一个token字符串。
const jwt = require('jsonwebtoken');
const generateToken = (user) => {
return jwt.sign(
{ id: user.id },
process.env.JWT_SECRET,
{ expiresIn: '1h' }
);
};
接下来,我们改造用户登陆接口,实现完整的认证流程:
username
和password
。sequelize
的findOne
方法查询用户信息。// 用户登陆
router.post('/login', async (req, res) => {
try {
const { username, password } = req.body;
// 根据用户名查询用户信息
const user = await User.findOne({
where: {
username: username,
}
});
// 用户存在
if (user) {
// 校验密码
if (password !== user.password) {
throw new CustomError("密码错误!");
}
// 生成token
const token = generateToken(user);
// 将token存储到Redis
await redisClient.set(`token:${user.id}`, token, 'EX', 3600); //1小时过期
// 将token返回
const result = { token: token };
success(res, "登录成功", result);
} else {
throw new CustomError("用户不存在!");
}
} catch (err) {
res.status(500).json({ error: err.message });
}
});
在utils
文件夹下新建auth.js
文件,实现token的身份校验:
jsonwebtoken
库的verify
方法校验token信息,校验失败返回错误信息。const jwt = require('jsonwebtoken');
const redisClient = require('../config/redis');
const verifyToken = async (req, res, next) => {
const token = req.header('Authorization')?.replace('Bearer ', '');
if (!token) {
return res.status(401).json({ error: 'No token provided' });
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
const user = await User.findOne({ where: { id: decoded.id } });
if (!user) {
return res.status(404).json({ error: 'User not found' });
}
req.user = user;
next();
} catch (err) {
res.status(400).json({ error: 'Invalid token' });
}
};
module.exports = { verifyToken };
No token provided
Invalid token
通过以上步骤,我们实现了一套基于Node.js和Redis的登录认证流程。希望这篇文章能帮助你快速上手,轻松实现API安全防护。
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
Copyright 2005-2024 yuanmayuan.com 【源码园】 版权所有 备案信息
声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告