当前位置:

首页 > 编程开发 > ubuntu js怎样实现用户认证

ubuntu js怎样实现用户认证

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

在 Ubuntu 上搭建用户认证系统,用 Ja vaScript 走通整个流程,其实并不复杂。下面就把核心步骤拆开来讲,每一步都带着代码,方便你直接上手。

ubuntu js怎样实现用户认证

  1. 先挑个趁手的框架
    Node.js 生态里 Express.js 是最常用的 Web 框架,没有之一。它把路由、中间件这些基础工作都封装好了,省去很多重复劳动。当然你也可以用 Koa 或 Fastify,但 Express 的社区资源最丰富,出了问题容易找到答案。

  2. 初始化项目,装好依赖
    在 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 在某些场景下也会用到。

  3. 启动一个最基本的 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 端口。稍后我们会把路由和数据库加进来。

  4. 定义用户模型,顺便把密码加密逻辑嵌进去
    用 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 是安全与性能的平衡点,生产环境可以适当调高。

  5. 注册路由:把新用户写入数据库
    一个 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);
      }
    });
  6. 登录路由:验证密码后签发 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 只是一个示例,生产环境务必用环境变量或密钥管理服务来存放。

  7. 认证中间件:拦截请求并验证 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();
      });
    };
  8. 受保护的路由:只有认证用户才能访问
    在需要保护的路由上加上刚刚写的中间件,比如:

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

    这样,只有携带有效 JWT 的请求才能看到 /protected 返回的内容。

  9. 连接 MongoDB 数据库
    在应用启动前,调用 mongoose.connect。这里假设本地已经运行了 MongoDB 服务,数据库名是 my-auth-app。

    mongoose.connect('mongodb://localhost:27017/my-auth-app', {
      useNewUrlParser: true,
      useUnifiedTopology: true,
    });
  10. 合并所有代码,启动服务器
    把上面几段代码整合到一个 app.js 文件里,然后运行:

    node app.js

    如果一切顺利,终端会打印 Server running on port 3000,同时 MongoDB 连接成功。

最后多说两句:上面的示例只展示了核心逻辑,实际线上项目还需要考虑更多细节——比如强制使用 HTTPS、把 JWT 密钥放到环境变量、对输入做严格的校验(防止注入)、错误日志记录、密码重置流程等等。密码加密用的是 bcryptjs,但千万不要在代码里硬编码任何密钥或敏感信息。另外,如果打算用 session 替代 JWT,express-session 配合 connect-mongo 也是个成熟的方案。

从零到一搭一个认证系统,关键就是把这几个环节串起来:模型 → 注册 → 登录 → 中间件 → 保护路由。把每一步的代码写清楚,剩下的就是根据业务需求往上加功能了。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 Ubuntu
相关文章 更多
c语言段错误处理方法及排查解决步骤
c语言段错误处理方法及排查解决步骤

针对C语言常见的段错误(Segmentation fault)问题,详细剖析内存非法访问根因,提供结合GDB、Core Dump与AddressSanitizer的标准化排查解决步骤与预防方法。

windsurf开发工具安装与使用详细教程
windsurf开发工具安装与使用详细教程

本文提供全面的Windsurf开发工具安装与使用详细教程,覆盖客户端下载安装、环境配置与VS Code插件迁移、Cascade核心协作中枢使用技巧、Chat与Write双模式实战及高效开发规范。

Flutter状态管理框架有哪些?常用框架选择指南
Flutter状态管理框架有哪些?常用框架选择指南

全面盘点Flutter主流状态管理框架,深度解析Provider、Riverpod、Bloc与GetX的核心机制、优缺点及适用场景,提供系统化的状态管理选型指南。

Java抽象方法修饰符限制:为何不能用private或static
Java抽象方法修饰符限制:为何不能用private或static

深入剖析Java中抽象方法为何严禁使用private和static修饰符。从面向对象契约规范、方法继承重写、JVM动态绑定(invokevirtual)与静态解析(invokestatic)等底层机制展开详细推导,结合编译报错示例与全景对比,彻底理清修饰符限制背后的设计逻辑。

tomcat启动失败的原因和解决办法详解
tomcat启动失败的原因和解决办法详解

详细分析 Tomcat 启动失败的常见原因,并提供可操作的排查和解决方案。

uniapp网络请求拦截怎么设置及配置方法
uniapp网络请求拦截怎么设置及配置方法

详细讲解uni-app中网络请求拦截的配置方法与实现路径,包含uni.addInterceptor原生API拦截与Promise二次封装方案、Token注入、全局错误处理及踩坑提醒。

Vibe Island中文设置详细操作教程
Vibe Island中文设置详细操作教程

Vibe Island支持独立于macOS系统的语言设置。本文详解如何在Settings > General中将界面切换为简体中文,并验证Agent会话、审批按钮等核心功能的中文显示效果。

maven配置镜像和仓库区别及正确配置方法
maven配置镜像和仓库区别及正确配置方法

详细介绍 Maven 配置镜像与仓库的区别以及正确的配置步骤,帮助读者快速掌握实践操作。

langgraph python guide中文入门教程详解
langgraph python guide中文入门教程详解

本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

laravel创建项目步骤详解及命令教程
laravel创建项目步骤详解及命令教程

详解使用Composer与Laravel安装器创建Laravel项目的完整步骤、核心命令及环境配置,包含目录权限、环境文件与常见报错排查。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
IntelliJ IDEA macOS版
IntelliJ IDEA macOS版
Mac

IntelliJ IDEA 是 JetBrains 推出的专业集成开发环境,重点服务于 Java、Kotlin 与 JVM 项目开发。软件集成代码补全、静态检查、重构、调试、测试、版本控制及构建工具,并可借助插件扩展语言和框架支持。

PyCharm macOS版
PyCharm macOS版
Mac

JetBrains PyCharm 是面向 Python 开发者的集成开发环境,提供智能补全、代码检查、重构、调试、测试、版本控制及虚拟环境管理功能。Mac 版兼容 Intel 与 Apple 芯片,核心功能可免费使用。

WebStorm macOS版
WebStorm macOS版
Mac

JetBrains WebStorm 是面向 JavaScript、TypeScript 和现代 Web 技术的专业集成开发环境,可智能理解项目结构,提供代码补全、重构、错误检查、运行调试、测试及 Git 工具。

WINDOWS 更多
IntelliJ IDEA Windows版
IntelliJ IDEA Windows版
Windows

JetBrains IntelliJ IDEA 是以 Java、Kotlin 和 JVM 项目为核心的专业集成开发环境,提供智能补全、代码检查、安全重构、调试、测试、版本控制及构建工具集成。统一发行版的核心功能可免费用于商业和非商业项目,

PhpStorm Windows版
PhpStorm Windows版
Windows

PhpStorm 是 JetBrains 面向 PHP 与现代 Web 开发打造的专业集成开发环境,提供代码补全、静态检查、重构、调试、测试、数据库、版本控制及前端语言支持。Windows 用户可直接下载安装程序,

PyCharm Windows版
PyCharm Windows版
Windows

PyCharm 是 JetBrains 推出的 Python 集成开发环境,提供智能代码补全、错误检查、重构、调试、测试、Git、终端及 Jupyter Notebook 支持。统一版安装后可体验 30 天 Pro 功能,