通常会使用JWT(JSON Web Tokens)或OAuth等技术。
以下是一个使用JWT进行用户认证的步骤示例:
步骤 1:安装依赖
首先,需要安装一些额外的npm包来处理用户认证和密码加密。
npm install jsonwebtoken bcryptjs express-jwt
这里安装了jsonwebtoken
用于生成和验证JWT,bcryptjs
用于加密密码,express-jwt
用于将JWT中间件集成到Express应用中。
步骤 2:创建用户模型
在models
目录下创建一个User.js
文件来定义用户模型。
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const userSchema = new mongoose.Schema({
username: {
type: String,
required: true,
unique: true
},
password: {
type: String,
required: true
}
});
// 在保存用户之前加密密码
userSchema.pre('save', async function(next) {
if (this.isModified('password')) {
this.password = await bcrypt.hash(this.password, 8);
}
next();
});
module.exports = mongoose.model('User', userSchema);
步骤 3:创建认证路由
在routes
目录下创建一个auth.js
文件来处理注册和登录。
const express = require('express');
const jwt = require('jsonwebtoken');
const bcrypt = require('bcryptjs');
const User = require('../models/User');
const router = express.Router();
// 注册
router.post('/register', async (req, res) => {
try {
let { username, password } = req.body;
let user = new User({ username, password });
await user.save();
res.status(201).send('User successfully created');
} catch (error) {
res.status(500).send(error.message);
}
});
// 登录
router.post('/login', async (req, res) => {
try {
const { username, password } = req.body;
const user = await User.findOne({ username });
if (!user) {
return res.status(401).send('Authentication failed');
}
const isMatch = await bcrypt.compare(password, user.password);
if (!isMatch) {
return res.status(401).send('Authentication failed');
}
const token = jwt.sign({ _id: user._id }, process.env.JWT_SECRET, { expiresIn: '24h' });
res.status(200).json({ token });
} catch (error) {
res.status(500).send(error.message);
}
});
module.exports = router;
确保在.env
文件中设置了JWT_SECRET
环境变量,用于JWT签名。
步骤 4:集成认证中间件
在app.js
中集成认证路由,并添加一个中间件来保护需要认证的路由。
const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const postRoutes = require('./routes/posts');
const authRoutes = require('./routes/auth');
const expressJwt = require('express-jwt');
const app = express();
app.use(bodyParser.json());
app.use('/api/auth', authRoutes);
// 使用express-jwt中间件保护需要认证的路由
app.use('/api/posts', expressJwt({ secret: process.env.JWT_SECRET }), postRoutes);
module.exports = app;
步骤 5:测试认证
现在,你应该能够使用Postman或其他API测试工具测试注册和登录端点。注册一个新用户,然后使用返回的JWT令牌来访问受保护的端点。
注意事项
- 在生产环境中,应确保
.env
文件不被包含在版本控制中。 - 应该在服务器上配置HTTPS,以保证JWT令牌在传输过程中的安全性。
- 密码应始终使用强哈希算法进行加密。
- 考虑使用更复杂的用户认证策略,如OAuth、多因素认证等。
以上步骤为Node.js项目添加了基本的用户认证功能。根据项目需求,可能还需要添加密码重置、用户角色和权限等功能。