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库:

javascript 复制代码
npm install jsonwebtoken

生成Token

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

javascript 复制代码
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的示例:

javascript 复制代码
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的过程:

javascript 复制代码
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、启动服务器:

javascript 复制代码
node app.js

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

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

相关推荐
jktantan7 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
前端·javascript·vue.js
只睡四小时8 小时前
MCP 弃用 SSE?Node 分帧漏 81.7% 事件
node.js·webassembly·实时通信·mcp·streamable http
2601_962885728 小时前
quotes 字段全解:涨跌幅、振幅、换手率的口径与单位
java·前端·spring
excel9 小时前
encodeURI 和 encodeURIComponent 有什么区别?
前端
前端精髓9 小时前
调用openrouter的免费API模型
java·前端·javascript
赛博守夜人9 小时前
AI安全攻防与治理之十四:AI 安全测试不能脱离传统安全,Web、API、移动端与模型攻击面的组合拳
前端·人工智能·安全
开开心心_Every9 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
networknomad9 小时前
OpenReplay:自己搭的会话回放工具,给前端排错用的
前端·其他
缓慢更新10 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
陈随易11 小时前
AI 运维服务器,安全又可靠的方法
前端·后端·程序员