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

news/2025/1/16 21:24:30/

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/news/1563712.html

相关文章

六种主流虚拟化技术全解析:OpenStack、KVM、Hyper-V、VMware、Xen及Docker

秒懂虚拟化(一):从概念到网络、存储虚拟化全解析,通俗解读版-CSDN博客 秒懂虚拟化(二):服务器虚拟化、操作系统虚拟化、服务虚拟化全解析,通俗解读版_hostos和guestos-CSDN博客 秒…

uniapp省市区懒加载封装

一、z-region.vue 直接复制就可用&#xff0c;需要修改请求接口 getAddressList vue2和vue3皆可使用&#xff08;微信小程序&#xff0c;H5支持&#xff09; <template><view><view class"list"><picker class"picker" mode"…

PHP智慧小区物业管理小程序

&#x1f31f;智慧小区物业管理小程序&#xff1a;重塑社区生活&#xff0c;开启便捷高效新篇章 &#x1f31f; 智慧小区物业管理小程序是一款基于PHPUniApp精心雕琢的智慧小区物业管理小程序&#xff0c;它犹如一股清新的科技之风&#xff0c;吹进了现代智慧小区的每一个角落…

安装 MySQL 数据库

安装 MySQL 数据库 下载地址: https://downloads.mysql.com/archives/community/ 解压 mysql-8.0.20-winx64.zip 到 MySQL 文件夹 中在 MySQL 目录 下 、新建一个 my.ini 文件 (MySQL的配置文件) [mysqld] basedirD:/Program Files/MySQL datadirD:/Program Files/MySQL/dat…

浅谈云计算13 | 网络虚拟化

网络虚拟化 一、网络虚拟化技术原理剖析1.1 网络虚拟化基础概念2.2 关键技术原理2.2.1 虚拟交换机原理2.2.2 虚拟机网络连接原理2.2.3 网络功能虚拟化&#xff08;NFV&#xff09;原理 三、网络虚拟化的应用场景3.1 数据中心中的应用3.1.1 资源隔离与多租户支持3.1.2 网络流量优…

Android Studio:开启高效 Android 应用开发之旅

Android Studio 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为 Android 应用开发设计。以下是关于它的一些详细介绍&#xff1a; 一、基本功能 代码编辑与智能提示 它具有代码自动补全功能。当你输入代码时&#xff0c;它会根据上下文智能地提供类…

八、系统托盘与配置面板

没有人会把你变得越来越好&#xff0c;时间和经历只是陪衬。 支撑你变得越来越好的&#xff0c;是你自己坚强的意志、修养、品行、以及不断的反思和经验。 人生最好的贵人&#xff0c;就是努力向上的自己。 一、系统托盘 1、资源文件夹 新建资源文件夹&#xff0c;我们需要把…

Hive集群的安装准备

Hive的安装与集群部署详细指南 一、环境与软件准备 在开始Hive的安装与集群部署之前&#xff0c;确保您准备好以下环境和软件&#xff1a; 虚拟机软件&#xff1a; VMware Workstation 17.5&#xff1a;用于创建和管理虚拟机&#xff0c;确保可以在其上安装Linux操作系统。 …