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

掌握 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-democd auth-demonpm init -ynpm 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-demojwt_secret=your_jwt_secret_key

3.连接到 mongodb

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

// config/db.jsconst 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:

// models/user.jsconst 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.jsconst user = require('../models/user');const bcrypt = require('bcryptjs');const jwt = require('jsonwebtoken');// user registrationexports.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.jsconst 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.jsconst 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 应用程序。

以上就是掌握 Nodejs 和 Express 中的身份验证:综合指南的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1492013.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 14:27:40
下一篇 2025年12月19日 14:27:46

相关推荐

  • 配置 Tailwind CSS:初始化指南 |设置 Tailwind CSS:初始化指南

    简介 |简介意大利语:本文有意大利语和英语版本。向下滚动查看英文版本。英语:本文有意大利语和英语版本。向下滚动查看英文版本。 意大利语版 如何开始使用 tailwind css:项目完整指南 简介 在项目中配置 tailwind css 第一次似乎令人畏惧,特别是对于像我这样第一次尝试这个库的人来说…

    2025年12月24日
    000
  • 为什么多年的经验让我选择全栈而不是平均栈

    在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

    2025年12月24日
    000
  • 如何设置独立 CLI:在 Shopify 中使用 Tailwind CSS,而不使用 Nodejs

    依赖关系 Shopify CLI:一种命令行界面工具,可帮助您开发和管理 Shopify 主题。TailwindCSS:实用程序优先的 CSS 框架,用于快速构建自定义设计。 设置 我们使用 Tailwind 作为独立的 CLI 工具。更多信息可以参考官方指南。 注意:如果您在配备 Intel 处理…

    2025年12月24日
    000
  • 谷歌怎么下载html5_HTML5无需下载浏览器直接渲染运行页面文件【说明】

    HTML5不是需下载的软件,而是浏览器原生标准;Chrome默认支持,可通过file://协议直接打开本地.html文件,或用http-server启动本地服务器以支持完整API功能。 如果您已编写好HTML5页面文件,但误以为需要“下载HTML5”才能运行,则需明确:HTML5不是可下载的独立软件…

    2025年12月23日
    000
  • 如何标记html_使用注释标记HTML代码段落【段落】

    可使用HTML注释语法包裹段落以实现标识而不影响渲染,支持添加【段落】等前缀增强可读性,但不可嵌套注释,需用独立注释块替代。 如果您需要在HTML代码中对特定段落进行标识或说明,但又不希望这些标识影响页面渲染效果,则可以使用HTML注释语法将相关代码段落包裹起来。以下是实现此目的的具体方法: 一、使…

    2025年12月23日
    000
  • 手机编程html5工具_移动端代码编辑器推荐【指南】

    推荐五款移动端HTML5编辑器:Acode Editor支持一键预览;DroidEdit Pro可FTP/SFTP远程编辑;Codeanywhere提供云端IDE与Git集成;SpckEditor专注极简单页开发;Termux组合方案实现命令行本地服务。 如果您希望在手机上直接编写、调试和预览 HT…

    2025年12月23日
    000
  • 使用HTML表单GET方法创建带查询参数的动态搜索链接

    本教程详细阐述了如何在网页中,通过简单地将HTML表单的提交方法从`POST`更改为`GET`,来自动生成包含用户选择搜索条件的动态URL查询参数。这使得搜索结果页面的链接可分享、可收藏,并简化了%ignore_a_1%生成复杂URL的逻辑,后端可直接从URL中解析查询参数进行数据检索。 引言:动态…

    2025年12月23日
    000
  • Web表单提交:如何利用GET方法构建动态查询链接

    本文将指导您如何利用html表单的get方法,根据用户输入的搜索条件动态生成带有查询参数的url。当用户在表单中输入数据并提交时,get方法会自动将表单字段及其值附加到url作为查询字符串,从而创建如`/search?param1=value1&param2=value2`的链接。这对于实现…

    2025年12月23日
    000
  • 优化Django表单用户体验:验证失败时保留输入数据

    本文旨在解决Django表单在提交验证失败后,所有输入字段被清空的问题。通过指导开发者利用Django模板系统渲染表单字段(即使用`{{ form.field }}`),而非手动编写HTML “标签,可以确保用户之前输入的数据在验证失败时自动回填。这极大地提升了用户体验,避免了重复输入,…

    2025年12月23日
    000
  • Linux polybar状态栏,HTML+CSS加载进度实时!

    可通过 Bash 脚本在 Polybar 中模拟 HTML+CSS 风格进度条,利用 %{F#color} 标记和块字符 ▮ 动态显示已完成与未完成部分,结合实时任务进度输出格式化文本。 如果您希望在 Linux 的 Polybar 状态栏中显示一个基于 HTML+CSS 风格的加载进度条,并实时反…

    2025年12月23日
    000
  • Node.js Puppeteer爬虫的部署与自动化运行指南

    本教程详细指导如何部署基于node.js和puppeteer的网络爬虫,并实现其自动化定时执行。文章区分了前端静态网站与后端node.js脚本的部署策略,重点介绍了在windows环境下使用任务计划程序(task scheduler)进行定时任务配置的方法,同时提及了cors问题产生的原因及解决方案…

    2025年12月23日
    000
  • Linux Debian用Gulp自动化,CSS编译HTML零等待!

    首先安装Node.js与npm,再初始化项目并安装Gulp及插件,接着配置gulpfile.js定义Sass编译与浏览器同步任务,最后通过gulp命令启动自动化流程,实现CSS即时编译与HTML实时更新。 如果您希望在Linux Debian系统中通过Gulp实现自动化工作流,以达到CSS即时编译、…

    2025年12月23日
    000
  • Node.js爬虫的服务器端部署与定时任务配置指南

    本文旨在指导开发者如何部署基于%ignore_a_1%的puppeteer网络爬虫,并实现其定时自动化运行。针对本地开发环境,文章详细介绍了利用windows任务计划程序配置定时任务的步骤,确保node.js脚本能按预设时间自动执行,更新数据。同时,文章也探讨了生产环境下的部署思路,强调了客户端与服…

    2025年12月23日
    000
  • Node.js爬虫的部署、调度与静态网站数据集成指南

    本教程详细阐述如何部署和自动化运行node.js网络爬虫,实现定时数据抓取并更新静态网站内容。我们将探讨node.js脚本的服务器端运行机制、windows任务计划程序等调度工具的配置,以及爬取数据与静态html页面集成的策略,旨在帮助您构建高效且自动化的数据更新流程。 1. 理解Node.js爬虫…

    2025年12月23日
    000
  • 部署与自动化运行Node.js网络爬虫:使用Windows任务计划程序

    本文将指导您如何部署一个基于node.js和puppeteer的网络爬虫,并利用windows任务计划程序实现其每日定时自动运行。我们将深入探讨服务器端脚本与静态网页的区别,提供详细的步骤配置任务计划,并讨论在自动化过程中需要注意的关键事项,如资源管理、错误处理及跨平台部署思路。 理解Node.js…

    2025年12月23日
    000
  • 部署与调度Node.js爬虫:从本地执行到云端集成

    本教程详细指导如何部署和调度一个基于node.js的网页爬虫,使其能够每日自动运行并将其数据提供给前端应用。文章将区分客户端与服务器端javascript的运行环境,介绍本地任务调度方法,并探讨将爬虫集成到在线服务以实现数据共享的策略,同时涵盖数据持久化、cors处理及部署最佳实践。 1. 理解No…

    2025年12月23日
    000
  • Node.js中多字段多文件上传与MongoDB路径存储:Multer实践指南

    本教程详细讲解如何在node.js中使用multer处理html表单中的多字段文件上传,并将文件保存到服务器指定目录。核心内容包括multer配置,express路由集成,以及如何在控制器中正确获取上传文件信息并将其存储路径而非文件本身的数据存入mongodb,优化数据库性能和可维护性。 在现代We…

    2025年12月23日
    000
  • HTML表单怎么创建_HTML表单的基本结构与创建方法详解

    HTML表单通过标签包裹,使用action和method属性定义提交地址与方式,结合input、select、textarea等控件收集用户数据,配合label和name属性提升可用性与识别性,如注册表单示例所示。 创建HTML表单是网页开发中的基础技能,主要用于收集用户输入的信息,比如登录、注册、…

    2025年12月23日
    000
  • nodejs如何打开html_Node.js环境中HTML文件打开方法

    如果您在Node.js环境中需要打开或提供HTML文件的访问,通常意味着您希望启动一个本地服务器来渲染并展示HTML页面。以下是实现该功能的具体方法: 一、使用内置http模块创建服务器 通过Node.js的内置http模块可以快速搭建一个简易服务器,用于读取并返回HTML文件内容给客户端浏览器。 …

    2025年12月23日
    000
  • Formik中数字输入字段的范围验证实践

    本文旨在探讨在formik表单中使用`type=”number”`类型字段时,如何有效实现数值范围验证。针对html原生`min`和`max`属性在formik中可能无法提供预期验证效果的问题,我们将重点介绍如何利用强大的yup验证库,结合formik的`validation…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信