0

0

掌握 Nodejs 和 Express 中的身份验证:综合指南

碧海醫心

碧海醫心

发布时间:2024-10-05 21:22:08

|

1122人浏览过

|

来源于dev.to

转载

掌握 nodejs 和 express 中的身份验证:综合指南

身份验证是现代 web 应用程序中的重要组成部分,它允许开发人员确保只有授权用户才能访问特定功能或数据。在基于 node.js 和 express 的应用程序中,由于其效率和安全性,通常使用令牌(最常见的是 json web 令牌 (jwt))来处理身份验证。

在本指南中,我们将探索如何使用 jwt 在 node.js 和 express 应用程序中设置用户身份验证。最后,您将对如何为自己的项目实施安全身份验证有一个深入的了解。

什么是身份验证?

身份验证是验证用户或系统身份的过程。在 web 应用程序中,它涉及检查用户凭据(例如用户名和密码)。验证成功后,系统允许用户与应用程序交互。为了增强安全性,通常使用基于令牌的身份验证,例如 jwt。

为什么使用 json web 令牌 (jwt)?

jwt 是用于安全且无状态的基于令牌的身份验证的行业标准 (rfc 7519)。它们允许信息作为 json 对象在各方之间安全地传输。令牌通常用于验证用户身份,而不需要在服务器上存储会话数据,这使得 jwt 成为无状态应用程序的绝佳选择。

分步:在 node.js 和 express 中实现身份验证

让我们分解一下在 node.js 和 express 中使用 jwt 的基本身份验证系统的实现。

1.设置您的 node.js 应用程序

在深入进行身份验证之前,我们需要设置一个基本的 node.js 和 express 应用程序。请按照以下步骤初始化您的项目:


mkdir auth-demo
cd auth-demo
npm init -y
npm install express bcryptjs jsonwebtoken mongoose dotenv


以下是每个依赖项的用途:

  • express:构建 node.js 服务器的框架。
  • bcryptjs:安全地散列和比较密码。
  • jsonwebtoken:用于生成和验证 jwt。
  • mongoose:与 mongodb 交互。
  • dotenv:用于管理环境变量,例如机密和数据库连接字符串。

2.配置环境变量

在项目的根目录中创建一个 .env 文件来存储数据库 uri 和 jwt 密钥等敏感信息。


mongodb_uri=mongodb://localhost:27017/auth-demo
jwt_secret=your_jwt_secret_key


3.连接到 mongodb

在项目的根目录中,在 config 文件夹中创建一个 db.js 文件来处理 mongodb 连接。


// config/db.js
const mongoose = require('mongoose');
const dotenv = require('dotenv');

dotenv.config();

const connectdb = async () => {
  try {
    await mongoose.connect(process.env.mongodb_uri, {
      usenewurlparser: true,
      useunifiedtopology: true,
    });
    console.log('mongodb connected');
  } catch (err) {
    console.error('error connecting to mongodb:', err.message);
    process.exit(1);
  }
};

module.exports = connectdb;


4.创建用户模型

接下来,创建一个用户模型来定义 mongodb 中用户文档的结构。在 models 文件夹中,创建 user.js:

SpeechEasy
SpeechEasy

SpeechEasy是一种合成语音解决方案,可以让用户从文本生成高质量、易于理解的音频。

下载

// models/user.js
const mongoose = require('mongoose');

const userschema = new mongoose.schema({
  username: { type: string, required: true, unique: true },
  password: { type: string, required: true },
});

module.exports = mongoose.model('user', userschema);


5.实施用户注册

我们现在将设置用户注册的路线。在controllers文件夹中,创建一个名为authcontroller.js的文件并实现注册逻辑。


// controllers/authcontroller.js
const user = require('../models/user');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');

// user registration
exports.register = async (req, res) => {
  const { username, password } = req.body;

  try {
    const existinguser = await user.findone({ username });
    if (existinguser) {
      return res.status(400).json({ message: 'username already exists' });
    }

    const hashedpassword = await bcrypt.hash(password, 10);
    const newuser = new user({ username, password: hashedpassword });

    await newuser.save();
    res.status(201).json({ message: 'user registered successfully' });
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
};


此逻辑在将用户信息存储到 mongodb 之前,使用 bcrypt 对密码进行哈希处理。

6.实现用户登录

登录对于生成和返回 jwt 至关重要,客户端将使用 jwt 来验证未来的请求。下面是如何实现登录逻辑:


// controllers/authcontroller.js (continue)
exports.login = async (req, res) => {
  const { username, password } = req.body;

  try {
    const user = await user.findone({ username });
    if (!user) {
      return res.status(401).json({ message: 'invalid username or password' });
    }

    const ispasswordvalid = await bcrypt.compare(password, user.password);
    if (!ispasswordvalid) {
      return res.status(401).json({ message: 'invalid username or password' });
    }

    const token = jwt.sign({ id: user._id }, process.env.jwt_secret, { expiresin: '1h' });
    res.json({ token });
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
};


如果登录成功,我们使用jsonwebtoken生成jwt并将其发送给客户端。

7.为受保护的路由设置中间件

jwt 对于保护需要身份验证的路由很有用。我们将创建中间件来验证令牌并确保只有授权用户才能访问特定端点。


// middleware/authmiddleware.js
const jwt = require('jsonwebtoken');

exports.verifytoken = (req, res, next) => {
  const token = req.headers['authorization'];
  if (!token) return res.sendstatus(403);

  jwt.verify(token, process.env.jwt_secret, (err, user) => {
    if (err) return res.sendstatus(403);
    req.user = user;
    next();
  });
};


8.应用身份验证中间件

最后,让我们应用中间件来保护路由。例如,您可能希望用户仅在登录后才能访问其个人资料:


// routes/userRoutes.js
const express = require('express');
const { verifyToken } = require('../middleware/authMiddleware');
const { getUserProfile } = require('../controllers/userController');

const router = express.Router();

router.get('/profile', verifyToken, getUserProfile);

module.exports = router;


verifytoken 中间件检查请求标头中是否有有效的 jwt,如果令牌经过验证,则允许访问路由。

结论

在本指南中,我们介绍了在 node.js 和 express 应用程序中使用 jwt 实现用户身份验证的要点。我们逐步完成了使用基于令牌的身份验证设置用户注册、登录和保护路由的过程。有了这个基础,您可以在自己的应用程序中构建强大、安全的身份验证系统。随着您继续开发,请考虑添加刷新令牌、密码重置功能和多重身份验证以增强安全性。

通过掌握 node.js 和 express 的身份验证,您就可以顺利构建可扩展、安全的 web 应用程序。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

178

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

214

2025.12.18

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

417

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

533

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

311

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

76

2025.09.10

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

278

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
快速入门Node.JS全套完整版
快速入门Node.JS全套完整版

共83课时 | 8.4万人学习

nodejs开发基础教程
nodejs开发基础教程

共15课时 | 4.5万人学习

JavaScript设计模式视频教程
JavaScript设计模式视频教程

共28课时 | 5.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号