如何用Node.js实现一个支持JWT的认证中间件?

答案:通过jsonwebtoken库实现JWT认证中间件,验证Authorization头中的Bearer Token合法性。首先安装express和jsonwebtoken,登录时用jwt.sign生成带过期时间的Token;中间件authenticateToken解析请求头,提取并用jwt.verify校验签名与有效期,成功后挂载用户信息至req.user,失败则返回401或403;最后将中间件应用于需保护的路由。建议密钥由环境变量管理,前端正确携带Bearer Token,确保安全性和稳定性。

如何用node.js实现一个支持jwt的认证中间件?

要实现一个支持JWT的认证中间件,核心是验证请求头中的Token是否合法。Node.js结合jsonwebtoken库可以轻松完成这项任务。下面是一个实用且结构清晰的实现方式。

安装依赖

使用npm安装jsonwebtokenexpress

npm install express jsonwebtoken npm install –save-dev dotenv

生成和验证Token的基本逻辑

在用户登录成功后,服务端签发JWT;后续请求需携带该Token,中间件负责验证其有效性。

示例代码:

const jwt = require('jsonwebtoken');const SECRET_KEY = 'your-secret-key'; // 建议从环境变量读取// 登录接口:生成Tokenfunction login(req, res) {  const { username } = req.body;  const token = jwt.sign({ username }, SECRET_KEY, { expiresIn: '1h' });  res.json({ token });}

编写JWT认证中间件

中间件检查请求头Authorization是否存在,格式是否为Bearer ,并验证签名和过期时间。

function authenticateToken(req, res, next) {  const authHeader = req.headers['authorization'];  const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN  if (!token) {    return res.status(401).json({ error: 'Access token required' });  }  jwt.verify(token, SECRET_KEY, (err, user) => {    if (err) {      return res.status(403).json({ error: 'Invalid or expired token' });    }    req.user = user; // 将解码后的用户信息挂载到req对象    next();  });}

在Express路由中使用中间件

将中间件应用到需要保护的路由上。

const express = require('express');const app = express();app.use(express.json());// 公开接口(无需认证)app.post('/login', login);// 受保护接口(使用中间件)app.get('/profile', authenticateToken, (req, res) => {  res.json({ message: `Welcome ${req.user.username}` });});app.listen(3000, () => {  console.log('Server running on port 3000');});

基本上就这些。只要确保密钥安全、Token合理设置过期时间,并在前端正确传递,这套机制就能稳定运行。不复杂但容易忽略细节,比如空header处理和错误类型区分。

以上就是如何用Node.js实现一个支持JWT的认证中间件?的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月7日 01:16:01
下一篇 2025年11月7日 01:16:37

相关推荐

  • JavaScript 中 let、const、var 的区别?

    在 javascript 中,let、const 和 var 用来声明变量,但它们在三个方面有所不同: 1.范围2.重新分配3.吊装 1.范围: var 是一个函数作用域,意味着我们在函数内的任何位置访问 var 变量,如果我们尝试在函数外部访问它,它将显示错误 undefined示例:- func…

    2025年12月19日
    000
  • 为 Reddit API 构建 Nodejs 包装器:分步指南

    为 reddit api 构建 node.js 包装器:分步指南 在现代开发中,api 包装是一项至关重要的技能。封装 api 允许开发人员创建更具可读性、可维护性和可扩展性的代码,最终提高开发效率。今天,我们将探索如何在 node.js 中构建一个简单而有效的包装器来与 reddit 的 api …

    2025年12月19日
    000
  • Let、Const 和 Var 概述:主要差异解释

    曾经有一段时间,我使用并理解了 javascript 中 let、const 和 var 的实际用法,但用语言解释它是具有挑战性的。如果您发现自己处于类似的困境,那么需要关注的关键点是范围、提升、重新初始化和重新分配方面的差异。 范围: 如果在任何函数外部声明,则 var 是函数作用域或全局作用域。…

    2025年12月19日
    000
  • 自动化云恢复挑战:使用 GitHub Actions 实施 CI/CD

    云简历挑战 – 第 2 部分 介绍 在本系列的第一部分中,我们逐步介绍了如何使用各种 aws 服务构建云原生简历网站。现在,我们将通过使用 github actions 实施持续集成和持续部署 (ci/cd),将我们的项目提升到一个新的水平。这种自动化对于有效维护和更新我们的云简历至关重…

    2025年12月19日
    000
  • 如何在 React 中创建可访问的图表:包容性数据可视化指南

    什么是数据可视化中的可访问性 数据可视化是沟通的关键,但残疾人可能无法使用。数据可视化的可访问性对于确保所有用户(无论能力如何)都能理解图表并与图表交互至关重要。 highcharts 拥有创建可访问图表的工具和功能,依赖屏幕阅读器的用户将受益于正确的标签和注释。 选择正确的图表类型 不同的图表类型…

    2025年12月19日
    000
  • 在 Fastly 上使用 AI 构建“为您”推荐!

    忘记炒作;人工智能在哪里创造真正的价值?让我们利用边缘计算来利用人工智能的力量,打造更智能、快速、安全、可靠的用户体验。 推荐无处不在,每个人都知道,使网络体验更加个性化可以使其更具吸引力和成功。 我的亚马逊主页知道我喜欢家居用品、厨具,现在还喜欢夏季服装: 如今,大多数平台都让您在快速或个性化之间…

    2025年12月19日 好文分享
    000
  • 在 JavaScript 中实现 Ruby 的方法 Method

    突然觉得ruby的methods方法是不是很方便呢?编写代码时,它会列出对象可用的所有方法和属性,并允许您搜索它们,这对于调试非常有用。 除此之外,它对于检查 rails 等框架特有的方法也很有效,有助于代码阅读和理解库。虽然参考官方文档或源代码是一种很好的做法,但当您不需要深入研究或对方法名称有模…

    2025年12月19日
    000
  • 使用 Alpine JS 创建动态表

    本文探讨了使用轻量级 javascript 框架 alpine js 创建动态表。我们将把这个过程分为三个部分:页眉、正文和页脚,重点关注基本场景和复杂场景。 配置: html 结构: 我们从一个带有 x-data 指令的基本 html 元素 () 开始。该指令将反应数据绑定到元素。javascri…

    2025年12月19日
    000
  • ssential React Best Practices for Efficient Code and Lightning-Fast Web Apps in 4

    react 在 2024 年继续主导前端开发领域,使开发人员能够创建动态和响应式的 web 应用程序。无论您是 react 新手还是经验丰富的专业人士,掌握这七个最佳实践都将大大提高您的编码效率和应用程序性能。让我们潜入吧! 1. 智能组件结构:可重用性的关键 将你的 ui 分解成小的、可重用的组件…

    2025年12月19日
    000
  • C++如何实现一个B-树_C++数据结构之B-树的插入与删除操作图解

    B-树是一种自平衡多路搜索树,所有叶子节点位于同一层,每个节点最多有m-1个关键字、m个子节点,非根节点至少有⌈m/2⌉−1个关键字。插入时从根开始查找插入位置,节点满则分裂,确保不溢出;删除时若关键字在内部节点,用子树最值替换,遍历中保证节点关键字数大于t−1,不足时通过借元素或合并调整。核心操作…

    2025年12月19日
    000
  • c++中的模板参数推导规则_c++ универсальные ссылки与引用折叠

    模板参数推导结合通用引用和引用折叠实现完美转发,如std::make_unique通过T&&推导实参类型,依据引用折叠规则保持值类别,使std::forward能原样转发参数给目标函数。 在C++中,模板参数推导和引用折叠是理解泛型编程(尤其是完美转发和通用引用)的关键机制。它们共同…

    2025年12月19日
    000
  • c++的std::forward_list是什么 单向链表容器的使用【STL详解】

    std::forward_list 是 C++11 引入的单向无哨兵链表,内存更紧凑、头部操作高效,但不支持随机访问、反向迭代和 O(1) size()(C++17 起可选),适用于内存敏感、头部频繁增删且单向遍历的场景。 std::forward_list 是 C++11 引入的标准模板库(STL…

    2025年12月19日
    000
  • c++的PGO(Profile-Guided Optimization)是什么 如何让编译器深度优化【性能调优】

    PGO是通过真实运行时数据指导编译优化的技术,分插桩、采集、重编译三阶段,依赖高质量剖面数据,可提升性能5%~20%,关键在真实输入、合理配置与环境一致性。 PGO(Profile-Guided Optimization,基于性能剖析的优化)是 C++ 编译器利用真实运行时行为数据来指导优化决策的技…

    2025年12月19日
    000
  • C++17中的std::filesystem如何使用?(文件目录操作)

    c++kquote>std::filesystem 是 C++17 引入的跨平台文件系统库,提供 path 操作、存在性判断、目录遍历、增删改查等安全接口,需包含头文件、处理命名空间并注意编译器链接要求。 std::filesystem 是 C++17 引入的标准库模块,用于跨平台的文件和目录…

    2025年12月19日
    000
  • 如何为c++项目编写一个简单的Makefile g++编译自动化【入门教程】

    c++kquote>Makefile自动编译C++项目需定义目标、依赖和命令三部分,命令行以Tab开头;支持单文件编译、多文件分离编译链接、编译选项配置及clean清理规则,并可利用自动推导和变量简化维护。 用 Makefile 自动编译 C++ 项目,核心是告诉 make 哪些文件变了需要重…

    2025年12月19日
    000
  • 如何使用Bazel构建大型c++项目 Google的构建系统【工程化】

    Bazel构建大型C++项目的核心是模块化声明、显式依赖与可复现构建。通过BUILD文件明确定义目标源码、头文件、依赖及编译选项,划分职责清晰的包边界,用cc_library封装可复用组件,严格管控visibility与第三方依赖,并利用缓存、查询与调试工具提升效率。 用 Bazel 构建大型 C+…

    2025年12月19日
    000
  • C++如何手写一个智能指针?C++ RAII与引用计数实现【底层实践】

    智能指针核心是用RAII自动管理堆内存,避免裸指针的内存泄漏与崩溃;引用计数需独立分配内存并原子操作;拷贝/赋值需同步更新计数;重载*、->等运算符以支持指针式访问。 智能指针核心要解决什么问题 裸指针容易忘 delete、重复 delete、提前释放,导致内存泄漏或崩溃。手写智能指针本质是用…

    2025年12月19日
    000
  • C++如何解析命令行参数_C++ main函数argc与argv的处理方法

    答案是:main函数通过argc和argv接收命令行参数,argc为参数数量,argv存储各参数字符串,遍历argv可解析输入,如判断标志位或获取文件名。 在C++中,main函数接收命令行参数是程序与外部交互的基础方式之一。通过argc和argv,我们可以获取用户在启动程序时传入的参数,并据此控制…

    2025年12月19日
    000
  • c++中的false sharing(伪共享)是什么_c++多核缓存行问题与解决方案【并发】

    伪共享是多线程程序中因不同线程修改同一缓存行内不同变量,触发缓存一致性协议频繁同步而导致的性能下降;需通过填充、对齐或线程局部存储等方式隔离独写变量。 False sharing(伪共享)是多线程 C++ 程序在多核 CPU 上性能下降的常见隐形杀手——它不是代码逻辑错误,而是缓存系统“太聪明”导致…

    2025年12月19日
    000
  • C++如何检测内存泄漏_C++ Valgrind工具与CRT库的使用

    使用Valgrind和CRT调试堆库可有效检测C++内存泄漏:Valgrind在Linux下通过memcheck模块分析程序运行时内存错误,需编译时加-g选项并运行valgrind –leak-check=full命令,输出详细泄漏信息;Windows平台则利用Visual Studio…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信