首页 > 编程语言 >Ubuntu JS用户认证实现方法

Ubuntu JS用户认证实现方法

来源:互联网 2026-07-27 07:58:09

在Ubuntu上,使用Node.js与Express框架,结合Mongoose操作MongoDB,通过bcryptjs加密密码、jsonwebtoken签发JWT令牌,实现用户注册、登录功能,并利用认证中间件保护路由,构建完整的用户认证系统。

在 Ubuntu 上搭建用户认证系统,使用 JavaScript 完成整个流程,操作步骤较为直接。以下将核心环节逐一拆解,每个步骤均附带代码示例,便于直接实践。

Ubuntu JS用户认证实现方法

长期稳定更新的攒劲资源: >>>点此立即查看<<<

选择适合的 Web 框架

Node.js 生态中,Express.js 是使用最广泛的 Web 框架,已将路由、中间件等基础功能封装完善,能够减少重复性开发工作。Koa 或 Fastify 也可作为备选方案,但 Express 的社区资源最为丰富,遇到问题时更容易找到解决方案。

初始化项目并安装依赖

在 Ubuntu 终端中创建项目目录,执行 npm init -y 生成 package.json,然后安装以下依赖包:

mkdir my-auth-app
cd my-auth-app
npm init -y
npm install express mongoose bcryptjs jsonwebtoken express-session

各依赖包的功能说明:express 为 Web 框架,mongoose 用于操作 MongoDB,bcryptjs 负责密码加密,jsonwebtoken 用于生成和验证 JWT,express-session 用于会话管理。本示例主要使用 JWT,但 session 在某些场景下也有应用需求。

启动基础 Express 服务器

新建 app.js 文件,写入以下代码:

const express = require('express');
const app = express();
const port = 3000;

app.use(express.json());

app.listen(port, () => {
  console.log(`Server running on port ${port}`);
});

上述代码实现两个基本功能:引入 express 模块,监听 3000 端口。后续将逐步添加路由和数据库连接。

定义用户模型并嵌入密码加密逻辑

使用 Mongoose 定义 Schema,关键点在于 pre('sa ve') 钩子中自动对密码进行加盐哈希处理,确保不存储明文密码。

const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');

const userSchema = new mongoose.Schema({
  username: { type: String, unique: true },
  password: String,
});

userSchema.pre('sa ve', async function (next) {
  if (this.isModified('password') || this.isNew) {
    const salt = await bcrypt.genSalt(10);
    this.password = await bcrypt.hash(this.password, salt);
  }
  next();
});

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

unique: true 确保用户名不重复,genSalt(10) 中的 10 是安全性与性能的平衡值,生产环境可酌情调高。

注册路由:将新用户写入数据库

通过 POST 请求接收 username 和 password,创建 User 实例并保存。若用户名重复或参数异常,mongoose 会抛出异常,在 catch 中返回 500 状态码。

app.post('/register', async (req, res) => {
  try {
    const { username, password } = req.body;
    const newUser = new User({ username, password });
    await newUser.sa ve();
    res.status(201).send('User created');
  } catch (error) {
    res.status(500).send(error.message);
  }
});

登录路由:验证密码并签发 JWT

通过用户名查找用户,使用 bcrypt.compare 比对密码。匹配成功后生成有效期为 1 小时的 JWT,返回给客户端。

app.post('/login', async (req, res) => {
  try {
    const { username, password } = req.body;
    const user = await User.findOne({ username });
    if (!user || !(await bcrypt.compare(password, user.password))) {
      return res.status(401).send('Invalid credentials');
    }
    const token = jwt.sign({ userId: user._id }, 'your_jwt_secret', { expiresIn: '1h' });
    res.json({ token });
  } catch (error) {
    res.status(500).send(error.message);
  }
});

示例中的 your_jwt_secret 仅为演示用途,生产环境应使用环境变量或密钥管理服务进行存储。

认证中间件:拦截请求并验证 Token

编写 authenticateToken 函数,从请求头 Authorization 字段中提取 Bearer token,通过 jwt.verify 进行校验。token 无效或过期时,分别返回 401 或 403 状态码。

const jwt = require('jsonwebtoken');

const authenticateToken = (req, res, next) => {
  const authHeader = req.headers['authorization'];
  const token = authHeader && authHeader.split(' ')[1];
  if (token == null) return res.sendStatus(401);

  jwt.verify(token, 'your_jwt_secret', (err, user) => {
    if (err) return res.sendStatus(403);
    req.user = user;
    next();
  });
};

受保护路由:仅认证用户可访问

在需要保护的路由中添加上述中间件,示例如下:

app.get('/protected', authenticateToken, (req, res) => {
  res.json({ message: 'This is a protected route', user: req.user });
});

只有携带有效 JWT 的请求才能访问 /protected 路由并获取返回内容。

连接 MongoDB 数据库

在应用启动前调用 mongoose.connect。以下示例假设本地已运行 MongoDB 服务,数据库名称为 my-auth-app

mongoose.connect('mongodb://localhost:27017/my-auth-app', {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

合并代码并启动服务器

将上述代码整合到 app.js 文件中,然后执行以下命令:

node app.js

若配置正确,终端将输出 Server running on port 3000,同时 MongoDB 连接成功。

上述示例仅展示核心逻辑,实际线上项目还需考虑以下方面:强制使用 HTTPS、将 JWT 密钥存放于环境变量、对输入进行严格校验以防止注入、记录错误日志、实现密码重置流程等。密码加密使用 bcryptjs,切勿在代码中硬编码任何密钥或敏感信息。若计划使用 session 替代 JWT,express-session 配合 connect-mongo 也是成熟可行的方案。

从零搭建认证系统的关键环节可概括为:模型定义 → 注册功能 → 登录功能 → 中间件开发 → 路由保护。将每步代码落实后,即可根据业务需求进行功能扩展。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。