在 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