Express项目添加用户认证Auth中间件

通常会使用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项目添加了基本的用户认证功能。根据项目需求,可能还需要添加密码重置、用户角色和权限等功能。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值