渔倒到 2019-04-29 17:40 采纳率: 0%
浏览 3888

如何对jwt生成的token 实现验证(已经可以验证)、过期处理以及token刷新

这是我的jwt 模块,

// 引入模块依赖
const fs = require('fs');
const path = require('path');
const jwt = require('jsonwebtoken');
// 创建 token 类
class Jwt {
    constructor(data) {
        this.data = data;
        this._id = null; // 用户自定义 存放userid
        this._date = null; // 过期时间
        this._creatDate = null; // 创建时间
    }
    // 重新生成 token
    refreshToken() {
        let data = this.data;
        let created = Math.floor(Date.now() / 1000);
        let cert = fs.readFileSync(path.join(__dirname, './pem/private_key.pem'));//私钥 可以自己生成
        let token = jwt.sign({
            data,
            exp: created + 60 * 30, // 过期时间 
            iat: created, // 创建时间
        }, cert, {algorithm: 'RS256'});
        return token;
    }
    //生成token
    generateToken(data) {
        if (data) {
            this.data = data;
        }
        let data = this.data;
        let created = Math.floor(Date.now() / 1000);
        let cert = fs.readFileSync(path.join(__dirname, './pem/private_key.pem'));//私钥 可以自己生成
        let token = jwt.sign({
            data,
            exp: created + 60 * 30, // 过期时间 30 分钟
            iat: created, // 创建时间
        }, cert, {algorithm: 'RS256'});
        return token;
    }

    // 校验token
    verifyToken(data) {
        if (data) {
            this.data = data;
        }
        let token = this.data;
        let cert = fs.readFileSync(path.join(__dirname, './pem/public_key.pem'));//公钥 可以自己生成
        let res;
        try {
            let result = jwt.verify(token, cert, {algorithms: ['RS256']}) || {};
            this._id = result.data;
            this._date = result.exp;
            this._creatDate = result.iat;
            let {exp = 0} = result, current = Math.floor(Date.now() / 1000);
            if (current <= exp) {
                res = result.data || {};
            }
        } catch (e) {
            res = 'err';
        }
        return res;
    }
}

module.exports = Jwt;

我要在 app.js 中新增一个中间件拦截请求对token进行验证正确与否,是否过期,是否需要重新生成token,是否直接返回前端重新登录,这里边是怎样的一个过程以及实现token的刷新,失效处理的方法

  • 写回答

1条回答 默认 最新

  • 一只小爪磕 前端领域新星创作者 2024-05-28 14:13
    关注

    本答案由爪磕协同GPT-4o回答,希望对您有所帮助 解决问题望采纳!


    为了在 app.js 中新增一个中间件来拦截请求并验证 JWT 的正确性、过期情况,以及处理 Token 刷新和失效,你可以按照以下步骤进行实现:

    1. 安装必要的依赖
      确保你已经安装了 expressjsonwebtoken 模块:

      npm install express jsonwebtoken
      
    2. 创建一个新的中间件来处理 JWT 验证、过期检测和刷新
      你可以在 app.js 中实现这个中间件。

    3. 实现中间件逻辑

      • 验证 Token。
      • 检查 Token 是否过期。
      • 根据需要刷新 Token 或返回错误响应。

    下面是详细的实现步骤和代码:

    app.js 文件

    const express = require('express');
    const Jwt = require('./path/to/your/jwt/module');
    const app = express();
    
    // 中间件函数来验证和刷新 JWT
    function jwtMiddleware(req, res, next) {
        // 从请求头中获取 Token
        const token = req.headers['authorization'];
        
        if (!token) {
            return res.status(401).json({ message: 'Authorization token is required.' });
        }
    
        // 创建一个 Jwt 实例
        const jwtInstance = new Jwt(token);
    
        // 验证 Token
        const verifiedData = jwtInstance.verifyToken();
        
        if (verifiedData === 'err') {
            return res.status(401).json({ message: 'Invalid token.' });
        }
    
        // 检查 Token 是否过期
        const currentTime = Math.floor(Date.now() / 1000);
        if (currentTime > jwtInstance._date) {
            // Token 已过期,重新生成一个新的 Token
            const newToken = jwtInstance.refreshToken();
            
            // 在响应头中返回新的 Token
            res.setHeader('Authorization', newToken);
            
            // 继续处理请求
            next();
        } else {
            // Token 有效,继续处理请求
            req.user = verifiedData; // 将用户信息附加到请求对象
            next();
        }
    }
    
    // 使用中间件
    app.use(jwtMiddleware);
    
    // 示例路由
    app.get('/protected', (req, res) => {
        res.json({ message: 'This is a protected route', user: req.user });
    });
    
    // 启动服务器
    const PORT = process.env.PORT || 3000;
    app.listen(PORT, () => {
        console.log(`Server is running on port ${PORT}`);
    });
    

    Jwt 模块 (jwt.js)

    确保你的 Jwt 类代码正确无误。当前代码有一些小问题,需要修正:

    1. generateToken 函数中的 data 变量重复定义。
    2. verifyToken 函数应该返回 null 或合适的错误信息而不是字符串 'err'
    评论

报告相同问题?

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵