当前位置: 首页 > news >正文

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

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的示例:

const jwt = require('jsonwebtoken');
// 秘钥(请确保在实际应用中妥善保管)
const secretKey = 'your_secret_key';
// 用户数据(可以包含用户ID、用户名等信息)
const userData = {id: 1,username: 'exampleUser'
};
// 生成Token
const token = jwt.sign(userData, secretKey, { expiresIn: '1h' }); // 1小时后过期
console.log('Generated Token:', token);

验证Token

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

const jwt = require('jsonwebtoken');
// 秘钥(与生成Token时使用的秘钥相同)
const secretKey = 'your_secret_key';
// 假设这是从客户端接收到的Token
const receivedToken = 'your_received_token_here';
jwt.verify(receivedToken, secretKey, (err, decoded) => {if (err) {// Token无效或已过期console.error('Token is invalid or expired:', err.message);return;}// Token有效,decoded包含生成Token时传递的用户数据console.log('Decoded Token:', decoded);// 在这里处理用户请求,例如根据decoded.id获取用户信息
});

完整过程示例

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

const express = require('express');
const jwt = require('jsonwebtoken');
const bodyParser = require('body-parser');
const app = express();
const port = 3000;
// 秘钥(请确保在实际应用中妥善保管)
const secretKey = 'your_secret_key';
// 中间件:解析JSON请求体
app.use(bodyParser.json());
// 路由:生成Token
app.post('/login', (req, res) => {const { username, password } = req.body;// 在这里进行用户名和密码的验证(示例中省略)// 假设验证成功,生成Tokenif (username === 'exampleUser' && password === 'examplePass') {const userData = {id: 1,username: 'exampleUser'};const token = jwt.sign(userData, secretKey, { expiresIn: '1h' });res.json({ token });} else {res.status(401).json({ message: 'Invalid credentials' });}
});
// 路由:受保护的资源
app.get('/protected', (req, res) => {const token = req.headers['authorization'] && req.headers['authorization'].split(' ')[1];if (!token) {return res.status(401).json({ message: 'No token provided' });}jwt.verify(token, secretKey, (err, decoded) => {if (err) {return res.status(403).json({ message: 'Token is invalid or expired' });}// Token有效,返回受保护的数据res.json({ message: 'Welcome to the protected route', user: decoded });});
});
app.listen(port, () => {console.log(`Server is running on http://localhost:${port}`);
});

使用方法

1、启动服务器:

node app.js

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

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

http://www.lryc.cn/news/519725.html

相关文章:

  • [C++11]_[初级]_[工作线程如何监听主线程条件变量wait_for方法的使用]
  • Openstack持久存储-Swift,Cinder,Manila三者之间的区别
  • 深度学习第三弹:python入门与线性表示代码
  • 解决报错记录:TypeError: vars() argument must have __dict__ attribute
  • SpringBoot 原理篇(day14)
  • Vscode辅助编码AI神器continue插件
  • Type-C单口便携显示器-LDR6021
  • 青少年编程与数学 02-006 前端开发框架VUE 19课题、内置组件
  • 腾讯云AI代码助手编程挑战赛 - 使用 JavaScript 构建一个简易日历
  • Xcode 正则表达式实现查找替换
  • 学习flv.js
  • FreePBX 17 on ubuntu24 with Asterisk 20
  • 【算法】算法大纲
  • 【MySQL】SQL菜鸟教程(一)
  • 安装本地测试安装apache-doris
  • 【Apache Paimon】-- 13 -- 利用 paimon-flink-action 同步 mysql 表数据
  • IOS HTTPS代理抓包工具使用教程
  • 在 Ubuntu 22.04 上从 Wayland 切换到 X11的详细步骤
  • 【Linux】4.Linux常见指令以及权限理解(2)
  • ffmpeg aac s16 encode_audio.c
  • vue3监听器
  • 03-51单片机定时器和串口通信
  • 系统架构设计师考点—项目管理
  • 代码随想录算法训练营第三十二天|509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯
  • 【2024年华为OD机试】 (A卷,100分)- 总最快检测效率(Java JS PythonC/C++)
  • 【大数据】Apache Superset:可视化开源架构
  • LabVIEW调用不定长数组 DLL数组
  • MySQL 17 章——触发器
  • 面向对象分析与设计Python版 面向对象设计方法
  • GB/T 19582.1-2008主要内容