Node.js 中的 Token 认证机制详解

文章目录

  • Node.js 中的 Token 认证机制详解
    • 1. Token 认证基础
      • 1.1 什么是 Token 认证?
      • 1.2 Token 认证流程
    • 2. JWT (JSON Web Token) 实现
      • 2.1 安装依赖
      • 2.2 生成 Token
      • 2.3 验证 Token 中间件
    • 3. 完整实现示例
      • 3.1 登录接口
      • 3.2 受保护的路由
    • 4. Token 安全最佳实践
    • 5. Token 刷新机制
    • 6. 实际应用中的常见问题
      • 6.1 如何注销 Token?
      • 6.2 如何防止 CSRF 攻击?
    • 7. 性能优化建议

Node.js 中的 Token 认证机制详解

Token(令牌)是现代 Web 应用中常用的身份验证机制,相比传统的 Session 认证更加灵活和安全。下面我将详细介绍在 Node.js 中实现 Token 认证的完整方案。

1. Token 认证基础

1.1 什么是 Token 认证?

Token 认证是一种无状态的认证机制,服务器在用户登录后生成一个加密的字符串(Token)返回给客户端,客户端在后续请求中携带这个 Token 来证明身份。

1.2 Token 认证流程

Client Server 登录请求(用户名/密码) 验证成功,返回Token 携带Token的API请求 验证Token,返回数据 Client Server

2. JWT (JSON Web Token) 实现

2.1 安装依赖

npm install jsonwebtoken

2.2 生成 Token

const jwt = require('jsonwebtoken');
const secret = 'your-secret-key'; // 应该使用环境变量存储function generateToken(user) {return jwt.sign({userId: user.id,username: user.username,role: user.role},secret,{ expiresIn: '1h' } // Token有效期1小时);
}

2.3 验证 Token 中间件

function authenticateToken(req, res, next) {const authHeader = req.headers['authorization'];const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKENif (!token) return res.sendStatus(401); // 未提供Tokenjwt.verify(token, secret, (err, user) => {if (err) return res.sendStatus(403); // Token无效或过期req.user = user;next();});
}

3. 完整实现示例

3.1 登录接口

const express = require('express');
const app = express();
app.use(express.json());// 模拟用户数据
const users = [{ id: 1, username: 'admin', password: 'admin123', role: 'admin' },{ id: 2, username: 'user', password: 'user123', role: 'user' }
];app.post('/login', (req, res) => {const { username, password } = req.body;// 查找用户const user = users.find(u => u.username === username && u.password === password);if (!user) {return res.status(401).json({ error: '用户名或密码错误' });}// 生成Tokenconst token = generateToken(user);res.json({ message: '登录成功',token,user: {id: user.id,username: user.username,role: user.role}});
});

3.2 受保护的路由

app.get('/protected', authenticateToken, (req, res) => {res.json({ message: '这是受保护的内容',user: req.user });
});

4. Token 安全最佳实践

安全措施实现方式重要性
使用 HTTPS部署 SSL 证书★★★★★
设置合理有效期expiresIn 参数★★★★☆
使用强密钥复杂密钥,定期更换★★★★★
存储安全前端使用 HttpOnly Cookie★★★★☆
黑名单机制注销的 Token 加入黑名单★★★☆☆

5. Token 刷新机制

// 生成刷新Token
function generateRefreshToken(user) {return jwt.sign({ userId: user.id },secret + 'refresh', // 使用不同的密钥{ expiresIn: '7d' } // 较长有效期);
}// 刷新Token接口
app.post('/refresh-token', (req, res) => {const { refreshToken } = req.body;jwt.verify(refreshToken, secret + 'refresh', (err, payload) => {if (err) return res.sendStatus(403);const user = users.find(u => u.id === payload.userId);if (!user) return res.sendStatus(404);const newToken = generateToken(user);res.json({ token: newToken });});
});

6. 实际应用中的常见问题

6.1 如何注销 Token?

JWT 本身是无状态的,要实现注销可以考虑:

  1. 短期 Token 有效期
  2. Token 黑名单
  3. 客户端主动删除 Token

6.2 如何防止 CSRF 攻击?

即使使用 Token 也需要注意 CSRF 防护:

  1. 使用 SameSite Cookie 属性
  2. 添加 CSRF Token
  3. 检查 Origin 和 Referer 头部

7. 性能优化建议

  1. 减少 Token 体积:只包含必要的信息
  2. 预编译正则:验证中间件中的正则表达式
  3. 异步验证:大量用户时考虑异步验证
  4. 缓存机制:频繁验证的用户可以缓存结果

通过以上实现,您可以在 Node.js 应用中构建一个安全、高效的 Token 认证系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/87457.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/87457.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

23 - HaLoAttention模块

论文《Scaling Local Self-Attention for Parameter Efficient Visual Backbones》 1、作用 HaloNet通过引入Haloing机制和高效的注意力实现,在图像识别任务中达到了最先进的准确性。这些模型通过局部自注意力机制,有效地捕获像素间的全局交互&#xf…

2025Mybatis最新教程(五)

第5章 ORM映射 5.1 MyBatis自动ORM失效 MyBatis只能自动维护库表”列名“与”属性名“相同时的对应关系,二者不同时,无法自动ORM。 自动ORM失效建表 create table t_managers(mgr_id int primary key auto_increment,mgr_name varchar(50),mgr_pwd varchar(50) ); 添加数据…

解决lombok注解失效问题

Lombok 注解失效是 Java 开发中的常见问题,通常由依赖配置、IDE 支持或构建工具设置引起。最近在拉取别人springboot3jdk21版本的项目时遇到了lombok注解失效,导致项目无法启动的问题,以下是我的解决方案: 首先检查idea 的lombok…

3分钟搭建LarkXR实时云渲染PaaS平台,实现各类3D/XR应用的一键推流

LarkXR是由Paraverse平行云自主研发的去中心化实时云渲染平台,以其卓越的性能和丰富完备的功能插件,引领3D/XR云化行业风向标。LarkXR适用于3D/XR开发者、设计师、终端用户等创新用户,可以在零硬件负担下,轻松实现超高清低时延的3…

vue3 watch监视详解

watch监视 一 &#xff1a;watch监视{ref}定义的基本类型结构 <template><div class"person"><h1>情况一:watch监视{ref}定义的基本类型结构</h1><h1>当前的和为{{ sum }}</h1><button click"changeSum">点我…

TensorFlow Serving学习笔记2: 模型服务

本文深入剖析 TensorFlow Serving 的核心架构与实现机制&#xff0c;结合源码分析揭示其如何实现高可用、动态更新的生产级模型服务。 一、TensorFlow Serving 核心架构 1.1 分层架构设计 TensorFlow Serving 采用模块化分层设计&#xff0c;各组件职责分明&#xff1a; 组件…

共享云桌面为什么能打败传统电脑

近年来&#xff0c;随着云桌面技术的快速发展&#xff0c;共享云桌面作为一种新型的计算模式&#xff0c;正在逐步改变人们的工作和生活方式。它凭借其独特的优势&#xff0c;正在逐步取代传统电脑&#xff0c;成为企业和个人用户的新选择。之所以在部分场景中展现出替代传统电…

B站PWN教程笔记-12

完结撒花。 今天还是以做题为主。 fmtstruaf 格式化字符串USER AFTER FREE 首先补充一个背景知识&#xff0c;指针也是有数据类型的&#xff0c;不同数据类型的指针xx&#xff0c;所加的字节数也不一样&#xff0c;其实是指针指的项目的下一项。如int a[20]&#xff0c;a是…

零基础设计模式——总结与进阶 - 3. 学习资源与下一步

第五部分&#xff1a;总结与进阶 - 3. 学习资源与下一步 到这里&#xff0c;你已经完成了设计模式主要内容的学习。但这仅仅是一个开始&#xff0c;设计模式的精髓在于实践和持续学习。本节将为你提供一些优质的学习资源和后续学习的建议&#xff0c;帮助你在这条道路上走得更…

多模态大语言模型arxiv论文略读(125)

Uni-Med: A Unified Medical Generalist Foundation Model For Multi-Task Learning Via Connector-MoE ➡️ 论文标题&#xff1a;Uni-Med: A Unified Medical Generalist Foundation Model For Multi-Task Learning Via Connector-MoE ➡️ 论文作者&#xff1a;Xun Zhu, Yi…

【学习笔记】NLP 基础概念

1.1 什么是 NLP 定义&#xff1a; 自然语言处理&#xff08;NLP&#xff09;**是一种让计算机理解、解释和生成人类语言的技术。它是人工智能领域中极为活跃且重要的研究方向&#xff0c;旨在模拟人类对语言的认知和使用过程 特点&#xff1a; 多学科交叉&#xff1a;结合计…

RNN为什么不适合大语言模型

在自然语言处理&#xff08;NLP&#xff09;领域中&#xff0c;循环神经网络&#xff08;RNN&#xff09;及衍生架构&#xff08;如LSTM&#xff09;采用序列依序计算的模式&#xff0c;这种模式之所以“限制了计算机并行计算能力”&#xff0c;核心原因在于其时序依赖的特性&a…

微信小程序一款不错的文字动画

效果图 .js Page({data: {list:[],animation:[text-left,text-right,text-top,text-bottom],text:[[春眠不觉晓&#xff0c;处处闻啼鸟。,夜来风雨声&#xff0c;花落知多少。 ],[床前明月光&#xff0c;疑是地上霜。,举头望明月&#xff0c;低头思故乡。],[千山鸟飞绝&#…

循环神经网络(RNN):序列数据处理的强大工具

在人工智能和机器学习的广阔领域中&#xff0c;处理和理解序列数据一直是一个重要且具有挑战性的任务。循环神经网络&#xff08;Recurrent Neural Network&#xff0c;RNN&#xff09;作为一类专门设计用于处理序列数据的神经网络&#xff0c;在诸多领域展现出了强大的能力。从…

手机SIM卡通话中随时插入录音语音片段(Windows方案)

手机SIM卡通话中随时插入录音语音片段&#xff08;Windows方案&#xff09; --本地AI电话机器人 上一篇&#xff1a;手机SIM卡通话中随时插入录音语音片段&#xff08;Android方案&#xff09;​​​​​​​ 下一篇&#xff1a;​​​​​​​编写中 一、前言 书接上文《手…

阿里云通义大模型:AI浪潮中的领航者

通义大模型初印象 在当今 AI 领域蓬勃发展的浪潮中&#xff0c;阿里云通义大模型宛如一颗璀璨的明星&#xff0c;迅速崛起并占据了重要的地位。随着人工智能技术的不断突破&#xff0c;大模型已成为推动各行业数字化转型和创新发展的核心驱动力。通义大模型凭借其强大的技术实…

【算法篇】逐步理解动态规划模型7(两个数组dp问题)

目录 两个数组dp问题 1.最长公共子序列 2.不同的子序列 3.通配符匹配 本文旨在通过对力扣上三道题进行讲解来让大家对使用动态规划解决两个数组的dp问题有一定思路&#xff0c;培养大家对状态定义&#xff0c;以及状态方程书写的思维。 顺序&#xff1a; 题目链接-》算法思…

什么是 HTTP Range 请求(范围请求)

HTTP Range 请求&#xff0c;即范围请求&#xff0c;是一种 HTTP 请求方法&#xff0c;允许客户端请求资源的部分数据。这种请求在处理大型文件&#xff08;如视频、音频、或大文件下载&#xff09;时特别有用&#xff0c;因为它可以有效地进行断点续传和按需加载数据&#xff…

java集合(十) ---- LinkedList 类

目录 十、LinkedList 类 10.1 位置 10.2 特点 10.3 与 ArrayList 的区别 10.4 构造方法 10.5 常用方法 十、LinkedList 类 10.1 位置 LinkedList 类位于 java.util 包下 10.2 特点 是 List 接口的实现类是 Deque 接口的实现类底层使用双向循环链表结构 10.3 与 Arra…

kafka消费的模式及消息积压处理方案

目录 1、kafka消费的流程 2、kafka的消费模式 2.1、点对点模式 2.2、发布-订阅模式 3、consumer消息积压 3.1、处理方案 3.2、积压量 4、消息过期失效 5、kafka注意事项 Kafka消费积压(Consumer Lag)是指消费者处理消息的速度跟不上生产者发送消息的速度&#xff0c;导致消息在…