Node.js登陆认证秘籍:快速上手,轻松实现API安全防护

时间:2025-03-31 00:04 分类: js教程

前言

在当今企业级开发中,Token认证机制已经成为了保护API安全的行业标准。今天,我们将通过实战演练,手把手教你如何利用Node.js生成JSON Web Token(JWT),并结合Redis缓存,实现一套高效、安全的认证流程。

一、安装工具库

首先,我们需要安装以下工具库:

  • Express:Node.js的内置模块,用于创建web服务器。
  • jsonwebtoken:用于生成和校验token的工具。
  • ioredis:封装了Redis客户端,便于操作Redis数据库。
  • dotenv:用于管理本地环境变量。
  • mysql2:用于操作MySQL数据库。
  • sequelize:封装了数据库操作,支持通过内置API而非SQL语句进行数据库操作。

使用以下命令安装这些库:

npm install express jsonwebtoken ioredis dotenv mysql2 sequelize

二、配置环境

在项目根目录下创建.env文件,并在app.js中配置dotenv

require('dotenv').config();

这样,我们就可以在项目中自定义的文件中获取.env文件中配置的数据了,例如:

const REDIS_PORT = process.env.REDIS_PORT;

三、配置Redis

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

JWT是一种具体的Token实现方式,是一种认证解决方案。我们可以使用jsonwebtoken库的sign方法生成一个token字符串。

const jwt = require('jsonwebtoken');

const generateToken = (user) => {
  return jwt.sign(
    { id: user.id },
    process.env.JWT_SECRET,
    { expiresIn: '1h' }
  );
};

五、改造用户登陆接口

接下来,我们改造用户登陆接口,实现完整的认证流程:

  1. 获取请求参数:usernamepassword
  2. 使用sequelizefindOne方法查询用户信息。
  3. 如果用户不存在,返回错误信息。
  4. 用户存在,密码不对,返回错误信息。
  5. 生成token信息。
  6. 将token信息存储到Redis,设置过期时间。
  7. 将token返回给前端。
// 用户登陆
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 });
  }
});

六、Token身份校验

utils文件夹下新建auth.js文件,实现token的身份校验:

  1. 从请求头中获取token信息,如果token不存在,就返回错误信息。
  2. 使用jsonwebtoken库的verify方法校验token信息,校验失败返回错误信息。
  3. 从Redis缓存中获取token信息,如果token不存在,就返回错误信息。
  4. 校验成功,才能访问其他资源。
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 };

七、测试结果

  1. header为空,返回错误信息:No token provided
  2. token校验失败,返回错误信息:Invalid token
  3. token校验成功,可以访问其他资源。

通过以上步骤,我们实现了一套基于Node.js和Redis的登录认证流程。希望这篇文章能帮助你快速上手,轻松实现API安全防护。

声明:

1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。

2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。

3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。

4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。

本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 0人参与,0条评论
查看更多

Copyright 2005-2024 yuanmayuan.com 源码园 版权所有 备案信息

声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告