构建安全的用户登录API:从请求验证到JWT令牌生成
为了实现这个后端POST /api/users/login
端点,我们可以使用Node.js和Express框架,并结合一些常用的库如jsonwebtoken
、bcrypt
和express-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