Express身份验证揭秘:构建安全用户登录与JWT认证流程

Express身份验证揭秘:构建安全用户登录与JWT认证流程

在构建Web应用时,用户登录和身份认证是基本且重要的功能。本篇博客将深入介绍如何在Express框架中实现用户登录功能,并使用JSON Web Token (JWT) 进行身份验证,确保只有经过验证的用户才能访问受保护的接口。

用户登录接口的实现

设置路由

首先,我们需要定义用户登录的路由,以便客户端可以发送登录请求。

javascript 复制代码
// user.js
router.post('/registers', validate(validator.register), userController.register)
  .post('/logins', userController.login);

添加参数校验

使用express-validator库对登录请求的参数进行校验,确保提交的数据符合我们的预期。

javascript 复制代码
// userValidator.js
exports.login = [
  body('email').notEmpty().withMessage('邮箱不能为空').isEmail().withMessage('邮箱格式不正确'),
  body('password').notEmpty().withMessage('密码不能为空')
];

实现登录逻辑

userController.js中,我们通过比较数据库中的用户信息来实现登录逻辑。

javascript 复制代码
// userController.js
exports.login = async (req, res) => {
  let user = await User.findOne(req.body);
  if (!user) {
    res.status(401).json({ error: "邮箱或者密码不正确" });
  } else {
    // JWT生成逻辑...
    user = user.toJSON()
    user.token = jwt.sign(user, 'secret_key')
    res.status(200).json(user)
  }
};

使用JWT进行身份验证

JWT是一种用于安全地在客户端和服务器之间传递信息的方法。它可以用于用户身份的验证和授权。

生成和解析JWT

我们使用jsonwebtoken库来生成和验证JWT。首先安装该库,然后在util/jwt.js中封装相关函数。

javascript 复制代码
// jwt.js
const jwt = require('jsonwebtoken');
exports.createToken = async (userinfo) => {
  return jwt.sign({ userinfo }, 'secret_key', { expiresIn: '1h' });
};

应用JWT验证中间件

创建JWT验证中间件,确保只有带有有效JWT的请求才能访问受保护的接口。

javascript 复制代码
// jwt.js
exports.verifyToken = async (req, res, next) => {
  let token = req.headers.authorization?.split('Bearer ')[1];
  if (!token) {
    return res.status(401).json({ error: '请传入token' });
  }
  try {
    req.user = jwt.verify(token, 'secret_key');
    next();
  } catch (e) {
    res.status(401).json({ error: '无效的token' });
  }
};

接口鉴权

在需要进行身份验证的路由上应用verifyToken中间件。

javascript 复制代码
// user.js
router.get('/lists', verifyToken, userController.list);

代码优化与配置管理

为了提高代码的可维护性,我们将数据库连接字符串和JWT密钥等配置信息单独存放在配置文件中。

javascript 复制代码
// config.default.js
exports.mongoPath = 'mongodb://localhost:27017/express-video';
exports.secretKey = 'secret_key';

同时,我们在JWT验证后将用户信息存放在req对象上,以便在后续的处理流程中直接使用。

javascript 复制代码
// jwt.js
req.user = jwt.verify(token, config.secretKey);

总结

通过上述步骤,我们成功地在Express应用中实现了用户登录功能,并引入了JWT进行用户身份验证,为接口访问提供了安全保障。本文还介绍了如何优化代码结构和配置管理,使得项目更加健壮和易于维护。希望这篇博客能帮助你在构建自己的Express应用时,更加得心应手。

相关推荐
小马爱打代码9 分钟前
SpringBoot + 消息生产链路追踪 + 耗时分析:从创建到发送,全链路性能可视化
java·spring boot·后端
小码哥_常11 分钟前
MyBatis批量插入:从5分钟到3秒的逆袭之路
后端
烛之武2 小时前
SpringBoot基础
java·spring boot·后端
橙序员小站2 小时前
Harness Engineering:从 OpenClaw 看 AI 助理的基础设施建设
后端·aigc·openai
小陈工2 小时前
2026年3月28日技术资讯洞察:5G-A边缘计算落地、低延迟AI推理革命与工业智造新范式
开发语言·人工智能·后端·python·5g·安全·边缘计算
azhou的代码园3 小时前
基于SpringBoot+微信小程序的图片识别科普系统
spring boot·后端·微信小程序
Tony Bai4 小时前
Rust 看了流泪,AI 看了沉默:扒开 Go 泛型最让你抓狂的“残疾”类型推断
开发语言·人工智能·后端·golang·rust
四千岁4 小时前
2026 最新版:WSL + Ubuntu 全栈开发环境,一篇搞定!
javascript·node.js
用户3167361303424 小时前
javaLangchain4j从官方文档入手,看他做了什么——具体使用(二)
后端
無名路人4 小时前
Zsh 脚本 + VS Code 任务:NestJS + Vue3 一键部署到 1Panel
运维·后端·自动化运维