node.js中实现token的生成与验证

server/2025/1/17 3:00:55/

Token(令牌)是一种用于在客户端和服务器之间安全传输信息的加密字符串。在Web开发中,Token常用于身份验证和授权,确保用户能够安全地访问受保护的资源。

作用与意义

  1. 身份验证:Token可以用来验证用户的身份,确保用户已经通过认证流程。
  2. 授权:通过Token,服务器可以识别用户的权限,从而允许或拒绝访问特定的资源。
  3. 状态管理:在无状态(stateless)的API设计中,Token可以携带用户的状态信息,而不需要在服务器端存储会话数据。
  4. 安全性:Token通常包含加密信息,可以有效防止CSRF(跨站请求伪造)和XSS(跨站脚本攻击)等安全威胁

在Node.js中生成与验证Token

在Node.js中,常用的库是jsonwebtoken(JWT),它提供了一种简单的方式来生成和验证JSON Web Tokens。

安装依赖

首先,你需要安装jsonwebtoken库:

npm install jsonwebtoken

生成Token

下面是一个生成Token的示例:

token keyword">const jwt token operator">= token function">requiretoken punctuation">(token string">'jsonwebtoken'token punctuation">)token punctuation">;
token comment">// 秘钥(请确保在实际应用中妥善保管)
token keyword">const secretKey token operator">= token string">'your_secret_key'token punctuation">;
token comment">// 用户数据(可以包含用户ID、用户名等信息)
token keyword">const userData token operator">= token punctuation">{token literal-property property">idtoken operator">: token number">1token punctuation">,token literal-property property">usernametoken operator">: token string">'exampleUser'
token punctuation">}token punctuation">;
token comment">// 生成Token
token keyword">const token token operator">= jwttoken punctuation">.token function">signtoken punctuation">(userDatatoken punctuation">, secretKeytoken punctuation">, token punctuation">{ token literal-property property">expiresIntoken operator">: token string">'1h' token punctuation">}token punctuation">)token punctuation">; token comment">// 1小时后过期
consoletoken punctuation">.token function">logtoken punctuation">(token string">'Generated Token:'token punctuation">, tokentoken punctuation">)token punctuation">;

验证Token

下面是一个验证Token的示例:

token keyword">const jwt token operator">= token function">requiretoken punctuation">(token string">'jsonwebtoken'token punctuation">)token punctuation">;
token comment">// 秘钥(与生成Token时使用的秘钥相同)
token keyword">const secretKey token operator">= token string">'your_secret_key'token punctuation">;
token comment">// 假设这是从客户端接收到的Token
token keyword">const receivedToken token operator">= token string">'your_received_token_here'token punctuation">;
jwttoken punctuation">.token function">verifytoken punctuation">(receivedTokentoken punctuation">, secretKeytoken punctuation">, token punctuation">(token parameter">errtoken punctuation">, decodedtoken punctuation">) token operator">=> token punctuation">{token keyword">if token punctuation">(errtoken punctuation">) token punctuation">{token comment">// Token无效或已过期consoletoken punctuation">.token function">errortoken punctuation">(token string">'Token is invalid or expired:'token punctuation">, errtoken punctuation">.messagetoken punctuation">)token punctuation">;token keyword">returntoken punctuation">;token punctuation">}token comment">// Token有效,decoded包含生成Token时传递的用户数据consoletoken punctuation">.token function">logtoken punctuation">(token string">'Decoded Token:'token punctuation">, decodedtoken punctuation">)token punctuation">;token comment">// 在这里处理用户请求,例如根据decoded.id获取用户信息
token punctuation">}token punctuation">)token punctuation">;

完整过程示例

下面是一个完整的示例,包括生成Token和验证Token的过程:

token keyword">const express token operator">= token function">requiretoken punctuation">(token string">'express'token punctuation">)token punctuation">;
token keyword">const jwt token operator">= token function">requiretoken punctuation">(token string">'jsonwebtoken'token punctuation">)token punctuation">;
token keyword">const bodyParser token operator">= token function">requiretoken punctuation">(token string">'body-parser'token punctuation">)token punctuation">;
token keyword">const app token operator">= token function">expresstoken punctuation">(token punctuation">)token punctuation">;
token keyword">const port token operator">= token number">3000token punctuation">;
token comment">// 秘钥(请确保在实际应用中妥善保管)
token keyword">const secretKey token operator">= token string">'your_secret_key'token punctuation">;
token comment">// 中间件:解析JSON请求体
apptoken punctuation">.token function">usetoken punctuation">(bodyParsertoken punctuation">.token function">jsontoken punctuation">(token punctuation">)token punctuation">)token punctuation">;
token comment">// 路由:生成Token
apptoken punctuation">.token function">posttoken punctuation">(token string">'/login'token punctuation">, token punctuation">(token parameter">reqtoken punctuation">, restoken punctuation">) token operator">=> token punctuation">{token keyword">const token punctuation">{ usernametoken punctuation">, password token punctuation">} token operator">= reqtoken punctuation">.bodytoken punctuation">;token comment">// 在这里进行用户名和密码的验证(示例中省略)token comment">// 假设验证成功,生成Tokentoken keyword">if token punctuation">(username token operator">=== token string">'exampleUser' token operator">&& password token operator">=== token string">'examplePass'token punctuation">) token punctuation">{token keyword">const userData token operator">= token punctuation">{token literal-property property">idtoken operator">: token number">1token punctuation">,token literal-property property">usernametoken operator">: token string">'exampleUser'token punctuation">}token punctuation">;token keyword">const token token operator">= jwttoken punctuation">.token function">signtoken punctuation">(userDatatoken punctuation">, secretKeytoken punctuation">, token punctuation">{ token literal-property property">expiresIntoken operator">: token string">'1h' token punctuation">}token punctuation">)token punctuation">;restoken punctuation">.token function">jsontoken punctuation">(token punctuation">{ token token punctuation">}token punctuation">)token punctuation">;token punctuation">} token keyword">else token punctuation">{restoken punctuation">.token function">statustoken punctuation">(token number">401token punctuation">)token punctuation">.token function">jsontoken punctuation">(token punctuation">{ token literal-property property">messagetoken operator">: token string">'Invalid credentials' token punctuation">}token punctuation">)token punctuation">;token punctuation">}
token punctuation">}token punctuation">)token punctuation">;
token comment">// 路由:受保护的资源
apptoken punctuation">.token function">gettoken punctuation">(token string">'/protected'token punctuation">, token punctuation">(token parameter">reqtoken punctuation">, restoken punctuation">) token operator">=> token punctuation">{token keyword">const token token operator">= reqtoken punctuation">.headerstoken punctuation">[token string">'authorization'token punctuation">] token operator">&& reqtoken punctuation">.headerstoken punctuation">[token string">'authorization'token punctuation">]token punctuation">.token function">splittoken punctuation">(token string">' 'token punctuation">)token punctuation">[token number">1token punctuation">]token punctuation">;token keyword">if token punctuation">(token operator">!tokentoken punctuation">) token punctuation">{token keyword">return restoken punctuation">.token function">statustoken punctuation">(token number">401token punctuation">)token punctuation">.token function">jsontoken punctuation">(token punctuation">{ token literal-property property">messagetoken operator">: token string">'No token provided' token punctuation">}token punctuation">)token punctuation">;token punctuation">}jwttoken punctuation">.token function">verifytoken punctuation">(tokentoken punctuation">, secretKeytoken punctuation">, token punctuation">(token parameter">errtoken punctuation">, decodedtoken punctuation">) token operator">=> token punctuation">{token keyword">if token punctuation">(errtoken punctuation">) token punctuation">{token keyword">return restoken punctuation">.token function">statustoken punctuation">(token number">403token punctuation">)token punctuation">.token function">jsontoken punctuation">(token punctuation">{ token literal-property property">messagetoken operator">: token string">'Token is invalid or expired' token punctuation">}token punctuation">)token punctuation">;token punctuation">}token comment">// Token有效,返回受保护的数据restoken punctuation">.token function">jsontoken punctuation">(token punctuation">{ token literal-property property">messagetoken operator">: token string">'Welcome to the protected route'token punctuation">, token literal-property property">usertoken operator">: decoded token punctuation">}token punctuation">)token punctuation">;token punctuation">}token punctuation">)token punctuation">;
token punctuation">}token punctuation">)token punctuation">;
apptoken punctuation">.token function">listentoken punctuation">(porttoken punctuation">, token punctuation">(token punctuation">) token operator">=> token punctuation">{consoletoken punctuation">.token function">logtoken punctuation">(token template-string">token template-punctuation string">`token string">Server is running on http://localhost:token interpolation">token interpolation-punctuation punctuation">${porttoken interpolation-punctuation punctuation">}token template-punctuation string">`token punctuation">)token punctuation">;
token punctuation">}token punctuation">)token punctuation">;

使用方法

1、启动服务器:

node apptoken punctuation">.js

2、使用POST请求访问/login路由,提供用户名和密码(示例中为exampleUser和examplePass),获取生成的Token。

3、使用GET请求访问/protected路由,并在请求头中提供Authorization字段,值为Bearer加上空格再加上Token。


http://www.ppmy.cn/server/158974.html

相关文章

LabVIEW光流跟踪算法

1. 光流跟踪算法的概述 光流(Optical Flow)是一种图像处理技术,用于估算图像中像素点的运动。通过比较连续帧图像,光流算法可以分析图像中的运动信息,广泛用于目标跟踪、运动检测和视频处理等场景。该示例使用了NI Vi…

【深度学习】关键技术-优化算法(Optimization Algorithms)详解与代码示例

优化算法详解与代码示例 优化算法是深度学习中的关键组成部分,用于调整神经网络的权重和偏置,以最小化损失函数的值。以下是常见的优化算法及其详细介绍和代码示例: 1. 梯度下降法 (Gradient Descent) 原理: 通过计算损失函数对…

Browser-Use Web UI:浏览器自动化与AI的完美结合

Browser-Use Web UI:浏览器自动化与AI的完美结合 前言简介一、克隆项目二、安装与环境配置1. Python版本要求2. 安装依赖3. 安装 Playwright4. 配置环境变量(非必要步骤)三、启动 WebUI四、配置1. Agent设置2. 大模型设置3. 浏览器相关设置4. 运行 Agent结语前言 Web UI是在…

OpenStack 网络服务的插件架构

OpenStack 的网络服务具有灵活的插件架构,可支持多种不同类型的插件以满足不同的网络需求。以下是对 OpenStack 网络服务插件架构中一些常见插件类型的介绍: 一、SDN 插件 Neutron 与 SDN 的集成:在 OpenStack 网络服务里,SDN 插…

C++并发编程之跨应用程序与驱动程序的单生产者单消费者队列

设计一个单生产者单消费者队列(SPSC队列),不使用C STL库或操作系统原子操作函数,并且将其放入跨进程共享内存中以便在Ring3(用户模式)和Ring0(内核模式)之间传递数据,是一…

【绝对无坑】Mongodb获取集合的字段以及数据类型信息

Mongodb获取集合的字段以及数据类型信息 感觉很LOW的一个数据仓工具seatunel,竟然不能自动读取mongodb的表结构信息,需要手工创建。 然鹅,本人对mongodb也是新手,很多操作也不知所措,作为一个DBA,始终还是…

jupyter notebook练手项目:线性回归——学习时间与成绩的关系

线性回归——学习时间与学习成绩的关系 第1步:导入工具库 pandas——数据分析库,提供了数据结构(如DataFrame和Series)和数据操作方法,方便对数据集进行读取、清洗、转换等操作。 matplotlib——绘图库,p…

一些常见的Java面试题及其答案

Java基础 1. Java中的基本数据类型有哪些? 答案:Java中的基本数据类型包括整数类型(byte、short、int、long)、浮点类型(float、double)、字符类型(char)和布尔类型(boo…