在 Node.js 中构建安全的用户注册和身份验证

2025-06-08

在 Node.js 中构建安全的用户注册和身份验证

目录

对于本系列,我正在学习Traversy Media的精彩视频教程

介绍

要开始用户注册和身份验证,我们首先要安装必要的依赖项。具体来说,我们将使用bcryptjs库将用户密码安全地存储为哈希值,并使用jsonwebtoken库生成用于用户身份验证的 JSON Web Tokens (JWT)。

安装依赖项

首先,让我们安装所需的库:



npm i bcryptjs
npm i jsonwebtoken


Enter fullscreen mode Exit fullscreen mode

生成 JWT 令牌

在此步骤中,我们将创建一个函数来生成稍后使用的 JWT 令牌。将此函数写入userController.js文件中。



const jwt = require("jsonwebtoken");
const bcrypt = require("bcryptjs");
const asyncHandler = require("express-async-handler");
const User = require("../models/userModel");

// Generate JWT
const generateToken = (id) => {
  return jwt.sign({ id }, process.env.JWT_SECRET, { expiresIn: "30d" });
};


Enter fullscreen mode Exit fullscreen mode

不要忘记JWT_SECRET.env文件中初始化变量。您可以为其选择任何合适的值。

注册用户

userController.js现在,我们将在文件中写下注册用户的逻辑。



const registerUser = asyncHandler(async (req, res) => {
  const { name, email, password } = req.body;

  if (!name || !email || !password) {
    res.status(400);
    throw new Error("Please add all fields");
  }

  // check if user exists
  const userExists = await User.findOne({ email });
  if (userExists) {
    res.status(400);
    throw new Error("User already exists");
  }

  // create hash password
  const salt = await bcrypt.genSalt(10);
  const hashedPassword = await bcrypt.hash(password, salt);

  // create user
  const user = await User.create({
    name,
    email,
    password: hashedPassword,
  });

  if (user) {
    res.status(201).json({
      _id: user.id,
      name: user.name,
      email: user.email,
      token: generateToken(user._id),
    });
  } else {
    res.status(400);
    throw new Error("Invalid user data");
  }
});


Enter fullscreen mode Exit fullscreen mode

让我们使用 Postman 测试注册过程并确保一切按预期进行。

注册用户邮递员

如果您再次尝试添加同一个用户,则会显示错误。

注册用户错误

验证用户

为了对注册用户启用身份验证,我们将在文件中实现“登录用户”功能userController,该功能将通过比较用户提供的电子邮件和密码来验证用户的身份。



const loginUser = asyncHandler(async (req, res) => {
  const { email, password } = req.body;

  if (!email || !password) {
    res.status(400);
    throw new Error("Please add all fields");
  }

  // Check for user email
  const user = await User.findOne({ email });

  if (user && (await bcrypt.compare(password, user.password))) {
    res.json({
      _id: user.id,
      name: user.name,
      email: user.email,
      token: generateToken(user._id),
    });
  } else {
    res.status(400);
    throw new Error("Invalid credentials");
  }
});


Enter fullscreen mode Exit fullscreen mode

让我们使用正确和不正确的凭据测试登录过程。

登录邮递员

邮递员登录错误

在下一篇文章中,我们将研究身份验证中间件,并创建一个新的 API 来获取登录用户的数据。

与我联系

鏂囩珷鏉ユ簮锛�https://dev.to/aneeqakhan/building-secure-user-authentication-in-nodejs-4cjj
PREV
如何使用 React 将 Google 地图添加到你的 Web 应用
NEXT
我是如何利用 NPM 下载的……以及为什么不应该相信它们