holyya.com
2026-01-18 00:42:32 Sunday
登录
文章检索 我的文章 写文章
Node.js登录注册
2023-06-28 00:45:28 深夜i     --     --
Node js 登录 注册 用户验证 数据库管理

Node.js是一种流行的后端开发技术,它可用于构建高度可扩展的Web应用程序和API。其中一个常见的用例是登录和注册系统。本文将介绍如何使用Node.js创建一个基本的登录注册系统。

要开始创建系统,您需要先安装Node.js和一些相关的库。最好使用Node.js的版本管理器nvm来安装Node.js和npm。然后在终端中运行以下命令:


nvm install node

这将安装最新版本的Node.js。然后,您可以使用以下命令初始化新的Node.js项目:


mkdir login-register-system

cd login-register-system

npm init -y

接下来,您需要安装一些库来帮助您创建系统。以下是必须的:

- Express:一个流行的Web应用程序框架。

- Passport:一个身份验证库。

- Bcrypt:一个用于散列密码的库。

您可以使用以下命令将它们全部安装:


npm install express passport passport-local bcrypt

这会将Express、Passport、Passport-Local和Bcrypt添加到项目中。

现在,您可以开始编写代码了。首先,您需要创建一个Express应用程序:


const express = require("express");

const app = express();

接下来,您需要配置Passport身份验证。为此,请定义用户模型,该模型代表数据库中的用户。以下是一个示例模型:


const users = [

 { id: "1", username: "admin", password: "$2a$10$ONB3tPz7mXQVvOWKjXkUbuHPaAoOy3aYCnmY8O0QbJPpIMo.33J3i" },

 { id: "2", username: "user", password: "$2a$10$CCdt9agnv5eF.jYyjgQmK.ZzJ2.dV2HBz8GYdZ0W0T/JKCRjxeyx2" },

];

const findById = (id) => {

 return users.find((user) => user.id === id);

};

const findByUsername = (username) => {

 return users.find((user) => user.username === username);

};

该模型使用bcrypt对密码进行哈希处理,并将用户保存在数组中。您可以使用此模型作为初始系统的用户存储库。

接下来,您需要定义Passport本地策略。本地策略允许您使用用户名和密码进行身份验证。定义以下策略:


const LocalStrategy = require("passport-local").Strategy;

passport.use(

 new LocalStrategy((username, password, done) => {

  const user = findByUsername(username);

  if (!user) {

   return done(null, false);

  }

  if (bcrypt.compareSync(password, user.password)) {

   return done(null, user);

  } else {

   return done(null, false);

  }

 })

);

该策略使用findByUsername函数来查找用户。如果找到用户,它将使用bcrypt.compareSync函数检查哈希的密码是否与提供的密码匹配。

接下来,您需要配置Passport,以便它可以将用户信息存储在会话中:


passport.serializeUser((user, done) => {

 done(null, user.id);

});

passport.deserializeUser((id, done) => {

 done(null, findById(id));

});

该代码定义了如何将用户序列化和反序列化为会话。在本例中,用户被序列化为其ID,反序列化时使用该ID获取用户。

现在,您可以开始为登录和注册页面编写路由。以下代码包括登录和注册的路由:


app.get("/login", (req, res) => {

 res.send(`

  <h1>Login</h1>

  <form action="/login" method="POST">

   <label for="username"><strong>Username:</strong></label>

   <input type="text" name="username" id="username" required>

   <label for="password"><strong>Password:</strong></label>

   <input type="password" name="password" id="password" required>

   <button type="submit">Login</button>

  </form>

 `);

});

app.post(

 "/login",

 passport.authenticate("local",

 )

);

app.get("/register", (req, res) => {

 res.send(`

  <h1>Register</h1>

  <form action="/register" method="POST">

   <label for="username"><strong>Username:</strong></label>

   <input type="text" name="username" id="username" required>

   <label for="password"><strong>Password:</strong></label>

   <input type="password" name="password" id="password" required>

   <button type="submit">Register</button>

  </form>

 `);

});

app.post("/register", (req, res) => {

 const username = req.body;

 if (findByUsername(username)) {

  res.send(`

   <h1>Error</h1>

   <p>Username already taken</p>

  `);

 } else {

  const hashedPassword = bcrypt.hashSync(password, 10);

  const user = { id: String(users.length + 1), username, password: hashedPassword };

  users.push(user);

  res.redirect("/success");

 }

});

登录页面包括用户名和密码输入表单,以及登录按钮。当表单提交时,它将使用passport.authenticate函数进行身份验证。如果验证成功,它将重定向到成功页面,否则它将重定向回登录页面。

注册页面与登录页面类似,但它还将在提交表单时将新用户添加到用户存储库。如果一个用户已经使用给定的用户名注册,则会返回错误消息。

最后,您需要定义成功页面:


app.get("/success", (req, res) => {

 if (req.isAuthenticated()) {

  res.send(`

   <h1>Success</h1>

   <p>You are logged in!</p>

  `);

 } else {

  res.redirect("/login");

 }

});

该页面检查当前用户是否通过身份验证。如果是,它将显示成功消息。否则,它将重定向到登录页面。

现在您已经创建了Node.js登录注册系统,并可以使用它为用户提供安全的登录和注册功能。要运行该系统,请在终端中运行以下命令:


node index.js

然后,您可以在Web浏览器中输入http://localhost:3000/login访问登录页面,尝试登录或注册新用户。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复