小段大帅 2017-11-28 23:38 采纳率: 0%
浏览 2837

Nodejs token使用问题

目前已经实现了登录产生token和token验证(后端服务器端产生、验证)。

但是还需要一下两个需求:

1、每次请求都刷新该token的过期时间。比如,1:00产生一个有效期为1h的token,我

在1:30的时候,请求了一次,需要刷新token过期时间为2:30。而且能否不改变原来token

2、主动使某个token失效。

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-06 20:32
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    要实现这些功能,你可以使用Node.js的express-session库来管理会话,并结合jsonwebtoken库来生成和验证令牌。

    以下是一个简单的示例,展示了如何处理这两个需求:

    const express = require('express');
    const session = require('express-session');
    const jwt = require('jsonwebtoken');
    
    // 创建一个新的express应用实例
    const app = express();
    
    // 设置session存储路径和超时时间
    app.use(session({
      secret: 'your-secret-key', // 随机字符串或哈希值
      resave: false,              // 是否保存当前状态
      saveUninitialized: true,    // 是否在未初始化的情况下保存session
      cookie: { maxAge: 60 * 60 * 1000 }, // 设置cookie的过期时间
    }));
    
    // 在这里添加你的路由逻辑
    
    // 用于获取用户信息的函数
    function getUserInfo(req) {
      return req.session.user;
    }
    
    // 用于生成并验证令牌的函数
    function generateToken(user) {
      const token = jwt.sign({ userId: user._id }, process.env.TOKEN_SECRET);
      return token;
    }
    
    // 用于刷新令牌的函数
    function refreshToken(token) {
      try {
        const decoded = jwt.verify(token, process.env.TOKEN_SECRET);
        const newExpireAt = Date.now() + (60 * 60 * 1000); // 更新token的有效期
        return jwt.sign(decoded, process.env.TOKEN_SECRET, { expiresIn: newExpireAt });
      } catch (error) {
        console.error(error);
        return null; // 如果验证失败,返回null
      }
    }
    
    // 用于使令牌失效的函数
    function revokeToken(token) {
      try {
        jwt.verify(token, process.env.TOKEN_SECRET, function(err, decoded) {
          if (err) {
            console.log("Token is invalid");
            return;
          }
    
          // 如果token有效,那么就删除它
          delete req.session.user;
    
          // 清除token
          req.session.destroy(function(err) {
            if (err) throw err;
          });
    
          // 返回true表示成功撤销令牌
          return true;
        });
      } catch (error) {
        console.error(error);
        return false; // 如果验证失败,返回false
      }
    }
    
    // 使用上述函数处理用户的请求
    app.get('/api/user/:userId', async (req, res) => {
      const user = await getUserInfo(req);
    
      // 根据用户ID生成新的token
      const token = generateToken(user);
    
      // 刷新token的有效期
      const refreshedToken = refreshToken(token);
    
      // 检查令牌是否已过期
      if (!refreshedToken || !await revokeToken(refreshedToken)) {
        res.status(401).json({ message: "Session expired or revoked" });
      } else {
        res.json({ token: token });
      }
    });
    
    

    这个例子中,我们首先创建了一个新的Express应用实例,并设置了session存储路径和超时时间。然后,我们在应用中添加了几个路由,包括一个用于获取用户信息的函数和两个用于生成和验证令牌的函数。最后,我们使用这三个函数处理用户的请求,并确保令牌的有效性。

    注意,你需要根据你的具体需求修改secret字段,以及生成和验证令牌的具体逻辑。

    展开全部

    评论
    编辑
    预览

    报告相同问题?

    悬赏问题

    • ¥15 PADS Logic 原理图
    • ¥15 PADS Logic 图标
    • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
    • ¥20 气象站点数据求取中~
    • ¥15 如何获取APP内弹出的网址链接
    • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
    手机看
    程序员都在用的中文IT技术交流社区

    程序员都在用的中文IT技术交流社区

    专业的中文 IT 技术社区,与千万技术人共成长

    专业的中文 IT 技术社区,与千万技术人共成长

    关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

    关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

    客服 返回
    顶部