一起学习网 一起学习网


Node.js用户登录功能实现

开发 Node.js登录,Express用户认证,bcrypt密码加密,express-session会话管理,MongoDB用户存储 06-15

实现用户登录功能的完整解决方案

在现代Web应用中,用户登录功能是必不可少的模块。本文将以Node.js和Express框架为例,介绍如何实现一个简单且安全的用户登录功能,包含用户认证、密码加密和会话管理。

一、功能需求分析

  • 用户能够通过用户名和密码登录系统
  • 密码在数据库中采用加密存储
  • 登录成功后,用户会话保持状态,便于访问受保护资源
  • 登录失败时,给出明确提示

二、技术选型

  • Node.js + Express:搭建后端服务
  • bcrypt:用于密码加密和验证
  • express-session:管理用户会话
  • MongoDB(Mongoose):存储用户数据

三、实现步骤

  1. 初始化项目并安装依赖
mkdir user-login-demo
cd user-login-demo
npm init -y
npm install express mongoose bcrypt express-session body-parser
  1. 创建服务器入口文件 app.js
const express = require('express');
const session = require('express-session');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');
const bcrypt = require('bcrypt');

const app = express();

app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({
  secret: 'your_secret_key',
  resave: false,
  saveUninitialized: false,
}));

// 连接MongoDB
mongoose.connect('mongodb://localhost:27017/userLoginDemo', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

// 定义用户模型
const userSchema = new mongoose.Schema({
  username: String,
  password: String,
});

const User = mongoose.model('User', userSchema);

// 渲染登录页(简单示例)
app.get('/login', (req, res) => {
  res.send(`
    <form method="POST" action="/login">
      <input name="username" placeholder="用户名" required />
      <input name="password" type="password" placeholder="密码" required />
      <button>登录</button>
    </form>
  `);
});

// 处理登录请求
app.post('/login', async (req, res) => {
  const { username, password } = req.body;
  const user = await User.findOne({ username });
  if (!user) {
    return res.send('用户不存在');
  }
  const match = await bcrypt.compare(password, user.password);
  if (!match) {
    return res.send('密码错误');
  }
  // 保存登录状态
  req.session.userId = user._id;
  res.send('登录成功');
});

// 受保护路由示例
app.get('/dashboard', (req, res) => {
  if (!req.session.userId) {
    return res.status(401).send('请先登录');
  }
  res.send('欢迎来到用户中心');
});

// 用户注册接口(示例)
app.get('/register', (req, res) => {
  res.send(`
    <form method="POST" action="/register">
      <input name="username" placeholder="用户名" required />
      <input name="password" type="password" placeholder="密码" required />
      <button>注册</button>
    </form>
  `);
});

app.post('/register', async (req, res) => {
  const { username, password } = req.body;
  const existingUser = await User.findOne({ username });
  if (existingUser) {
    return res.send('用户名已存在');
  }
  const hashedPassword = await bcrypt.hash(password, 10);
  const newUser = new User({ username, password: hashedPassword });
  await newUser.save();
  res.send('注册成功');
});

app.listen(3000, () => {
  console.log('服务器已启动,端口3000');
});

四、代码说明

  • 使用express-session管理用户会话,登录成功后将用户ID保存在session中。
  • 密码通过bcrypt.hash加密存储,登录时通过bcrypt.compare验证密码。
  • 提供注册接口供用户创建账号。
  • 受保护路由/dashboard通过检查session判断用户是否登录。

五、测试步骤

  1. 启动MongoDB服务。
  2. 运行node app.js启动服务器。
  3. 访问http://localhost:3000/register注册新用户。
  4. 访问http://localhost:3000/login登录。
  5. 登录成功后访问http://localhost:3000/dashboard,看到欢迎信息。
  6. 未登录访问/dashboard则提示需要登录。

总结 本文介绍了一个基础的用户登录功能实现方案,从注册用户、密码加密、登录验证到会话管理,覆盖了功能的核心点。开发者可以在此基础上扩展更多功能,如前端页面改进、验证码、多因素认证等,提升系统安全性和用户体验。


编辑:一起学习网