在 Node.js 中构建安全的用户注册和身份验证
目录
对于本系列,我正在学习Traversy Media的精彩视频教程
介绍
要开始用户注册和身份验证,我们首先要安装必要的依赖项。具体来说,我们将使用bcryptjs库将用户密码安全地存储为哈希值,并使用jsonwebtoken库生成用于用户身份验证的 JSON Web Tokens (JWT)。
安装依赖项
首先,让我们安装所需的库:
npm i bcryptjs
npm i jsonwebtoken
生成 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" });
};
不要忘记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");
  }
});
让我们使用 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");
  }
});
让我们使用正确和不正确的凭据测试登录过程。
在下一篇文章中,我们将研究身份验证中间件,并创建一个新的 API 来获取登录用户的数据。
与我联系
鏂囩珷鏉ユ簮锛�https://dev.to/aneeqakhan/building-secure-user-authentication-in-nodejs-4cjj 后端开发教程 - Java、Spring Boot 实战 - msg200.com
            后端开发教程 - Java、Spring Boot 实战 - msg200.com
          


