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

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;
  // 在这里进行用户名和密码的验证(示例中省略)
  // 假设验证成功,生成Token
  if (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.kler.cn/a/501493.html

相关文章:

  • linux-28 文本管理(一)文本查看,cat,tac,more,less,head,tail
  • 前端多语言
  • 中等难度——python实现电子宠物和截图工具
  • Vue.js组件开发-图片剪裁性能优化最佳方案实例
  • 苹果手机(IOS系统)出现安全延迟进行中如何关闭?
  • 负载均衡原理及算法
  • Qt6快速安装方法
  • 【深度学习基础】用深度学习做数据预测的大体流程
  • 【MySQL学习笔记】MySQL的索引
  • SQL美化器优化
  • 鸿蒙路由通信(路由跳转/参数传递)
  • 搭建prometheus+grafana监控系统抓取Linux主机系统资源数据
  • 《框架程序设计》复习题解析-2
  • docker 自建rustdesk服务器测试
  • 51单片机和STM32集成蓝牙模块实用指南
  • 多个表单使用相同的 ref 和 rules,表单验证规则不生效
  • 前端开发:Web前端和HTML
  • Flutter 3.x 版本升级实战:让老项目焕发新生
  • 深入理解 Spring MVC 中的 @ModelAttribute 注解
  • 【Python学习系列】数据类型(二)
  • 《DOM NodeList》
  • Openstack持久存储-Swift,Cinder,Manila三者之间的区别
  • 【对象存储】-- s3:\\、s3n:\\、s3a:\\ 简介
  • 力扣 岛屿数量
  • 在线游戏靶场【overthewire.org】之linux基础练兵场
  • Github 2025-01-09 Go开源项目日报 Top10