构建安全的用户登录API:从请求验证到JWT令牌生成

构建安全的用户登录API:从请求验证到JWT令牌生成

为了实现这个后端POST /api/users/login端点,我们可以使用Node.js和Express框架,并结合一些常用的库如jsonwebtokenbcryptexpress-validator来处理验证和密码校验。下面是一个完整的示例代码:

1. 安装依赖

首先,确保你已经安装了以下依赖包:

  • express
  • jsonwebtoken
  • bcryptjs
  • express-validator
  • dotenv(用于管理环境变量)
python 复制代码
npm install express jsonwebtoken bcryptjs express-validator dotenv

2. 配置环境变量

创建一个.env文件来存储JWT密钥和其他配置信息。

python 复制代码
JWT_SECRET=your_jwt_secret_key
REFRESH_TOKEN_SECRET=your_refresh_token_secret_key
PORT=3000

3. 创建用户数据模型(模拟数据库)

假设我们有一个简单的内存数据库来存储用户数据。在实际应用中,你应该使用一个真正的数据库,比如MongoDB或PostgreSQL。

js 复制代码
// users.js
const bcrypt = require('bcryptjs');

const users = [
  {
    id: 1,
    email: 'user@example.com',
    password: bcrypt.hashSync('secretpassword', 8)
  }
];

module.exports = { users };

4. 创建登录路由

创建一个app.js文件来设置Express服务器并定义登录路由。

js 复制代码
// app.js
require('dotenv').config();
const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const { check, validationResult } = require('express-validator');
const { users } = require('./users');

const app = express();
const PORT = process.env.PORT || 3000;

app.use(express.json());

// 登录路由
app.post('/api/users/login', [
  check('email', 'Invalid email').isEmail(),
  check('password', 'Password is required').not().isEmpty()
], (req, res) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(400).json({ errors: errors.array() });
  }

  const { email, password } = req.body;
  const user = users.find(u => u.email === email);

  if (!user) {
    return res.status(401).json({ message: 'Invalid email or password' });
  }

  const isMatch = bcrypt.compareSync(password, user.password);

  if (!isMatch) {
    return res.status(401).json({ message: 'Invalid email or password' });
  }

  // 生成JWT tokens
  const accessToken = jwt.sign({ userId: user.id }, process.env.JWT_SECRET, { expiresIn: '15m' });
  const refreshToken = jwt.sign({ userId: user.id }, process.env.REFRESH_TOKEN_SECRET, { expiresIn: '7d' });

  res.json({
    access_token: accessToken,
    refresh_token: refreshToken
  });
});

app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

5. 运行服务器

确保你的.env文件已经配置好,然后运行服务器:

js 复制代码
node app.js

6. 测试API

你可以使用Postman或cURL来测试这个API端点。

成功请求
shell 复制代码
curl -X POST http://localhost:3000/api/users/login \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com", "password": "secretpassword"}'

响应:

shell 复制代码
{
  "access_token": "your_access_token",
  "refresh_token": "your_refresh_token"
}
失败请求
shell 复制代码
curl -X POST http://localhost:3000/api/users/login \
-H "Content-Type: application/json" \
-d '{"email": "user@example.com", "password": "wrongpassword"}'

响应:

shell 复制代码
{
  "message": "Invalid email or password"
}

总结

以上代码实现了POST /api/users/login端点,处理了JSON请求,并根据请求内容返回相应的JWT tokens或错误信息。确保在生产环境中使用HTTPS来保护密码安全。

欢迎大家体验、试用阿里云百炼大模型和阿里云服务产品,链接如下:

阿里云百炼大模型

https://bailian.console.aliyun.com/

通义灵码_智能编码助手面向用户上线个人和企业版产品

https://tongyi.aliyun.com/lingma/pricing?userCode=jl9als0w

云工开物_阿里云高校计划助力高校科研与教育加速。

https://university.aliyun.com/mobile?userCode=jl9als0w

无影云电脑个人版简单易用、安全高效的云上桌面服务

https://www.aliyun.com/product/wuying/gws/personal_edition?userCode=jl9als0w

云服务器ECS省钱攻略五种权益,限时发放,不容错过

https://www.aliyun.com/daily-act/ecs/ecs_trial_benefits?userCode=jl9als0w

相关推荐
是店小二呀1 分钟前
CANN 异构计算的极限扩展:从算子融合到多卡通信的统一优化策略
人工智能·深度学习·transformer
Thexhy4 分钟前
Ollama 指南
ai·大模型
冻感糕人~5 分钟前
收藏备用|小白&程序员必看!AI Agent入门详解(附工业落地实操关联)
大数据·人工智能·架构·大模型·agent·ai大模型·大模型学习
予枫的编程笔记8 分钟前
【Linux入门篇】Ubuntu和CentOS包管理不一样?apt与yum对比实操,看完再也不混淆
linux·人工智能·ubuntu·centos·linux包管理·linux新手教程·rpm离线安装
ai_xiaogui8 分钟前
【开源前瞻】从“咸鱼”到“超级个体”:谈谈 Panelai 分布式子服务器管理系统的设计架构与 UI 演进
服务器·分布式·架构·分布式架构·panelai·开源面板·ai工具开发
陈西子在网上冲浪8 分钟前
当全国人民用 AI 点奶茶时,你的企业官网还在“人工建站”吗?
人工智能
victory043111 分钟前
hello_agent第九章总结
人工智能·agent
骇城迷影12 分钟前
Makemore 核心面试题大汇总
人工智能·pytorch·python·深度学习·线性回归
AI资源库17 分钟前
Remotion 一个用 React 程序化制作视频的框架
人工智能·语言模型·音视频
Web3VentureView20 分钟前
SYNBO Protocol AMA回顾:下一个起点——什么将真正推动比特币重返10万美元?
大数据·人工智能·金融·web3·区块链