我在Node.js(20.5.1)应用程序中遇到了一个与使用RSA密钥对进行JSON Web令牌(JWT)验证相关的问题.错误消息如下:

[16:39:56.959] FATAL (26460): invalid signature
err: {
  "type": "JsonWebTokenError",
  "message": "invalid signature",
  "stack":
      JsonWebTokenError: invalid signature
          at U:\Coding\MCShop-API\node_modules\jsonwebtoken\verify.js:171:19
          at getSecret (U:\Coding\MCShop-API\node_modules\jsonwebtoken\verify.js:97:14)
          at module.exports (U:\Coding\MCShop-API\node_modules\jsonwebtoken\verify.js:101:10)
          at verifyJWTToken (U:\Coding\MCShop-API\src\crypto.ts:28:37)
          at U:\Coding\MCShop-API\src\app.ts:39:45
          at Layer.handle [as handle_request] (U:\Coding\MCShop-API\node_modules\express\lib\router\layer.js:95:5)
          at trim_prefix (U:\Coding\MCShop-API\node_modules\express\lib\router\index.js:328:13)
          at U:\Coding\MCShop-API\node_modules\express\lib\router\index.js:286:9
          at Function.process_params (U:\Coding\MCShop-API\node_modules\express\lib\router\index.js:346:12)
          at next (U:\Coding\MCShop-API\node_modules\express\lib\router\index.js:280:10)
  "name": "JsonWebTokenError"
}

我还附加了crypto.ts文件,它为我的应用程序处理JSON Web令牌.

import crypto from 'crypto';
import { readFileSync } from 'fs';
import { JwtPayload, sign, verify } from 'jsonwebtoken';
import { logger } from './app';

export function generateRSAKeyPair() {
    const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {
        modulusLength: 512,
        publicKeyEncoding: { type: 'pkcs1', format: 'pem' },
        privateKeyEncoding: { type: 'pkcs1', format: 'pem' }
    });

    return { privateKey, publicKey };
}

export function generateJWTToken(admin: boolean, username: string) {
    const key = readFileSync('private.key', { encoding: 'utf-8', flag: 'r' });
    return sign({
        admin,
        username
    }, key, { algorithm: 'RS256' });
}

export function verifyJWTToken(token: string) {
    try {
        const key = readFileSync('public.key', { encoding: 'utf-8', flag: 'r' });
        const verifiedToken = verify(token, key, { algorithms: ['RS256'] }) as JwtPayload;
        if (!verifiedToken) return false;
        return verifiedToken

    } catch (error) {
        logger.fatal(error);
        return false;
    }
}

我已经确认了以下几点:

  • Key变量不是未定义的,它正在获取文件的内容.
  • readFileSync不使用缓存.
  • 传递给函数的值是有效的.
  • The attempted JWT is indeed valid confirmed by JWT.io jwt.io

我怀疑我处理密钥的方式或JWT库版本中可能有错误.

有没有人能帮我找出"无效签名"错误的根本原因,并提出可能的解决方案?任何真知灼见或建议都将不胜感激.

推荐答案

我记得go 年我也遇到了同样的问题,并在github年提出了一个问题.我使用Postman进行测试,令牌被父集合覆盖,包中没有问题.您可以确保有效令牌不会被无效令牌覆盖.

Javascript相关问答推荐

React:未调用useState变量在调试器的事件处理程序中不可用

使用i18next在React中不重新加载翻译动态数据的问题

google docs boldText直到按行执行应用脚本错误

在拖放时阻止文件打开

屏幕右侧屏障上的产卵点""

数字时钟在JavaScript中不动态更新

WebGL 2.0无符号整数输入变量

并不是所有的iframe都被更换

如何在ASP.NET中使用Google Charts API JavaScript将条形图标签显示为绝对值而不是负值

如何在每次单击按钮时重新加载HighChart/设置HighChart动画?

如何使用JavaScript拆分带空格的单词

Google脚本数组映射函数横向输出

JQuery使用选项填充HTMLSELECT并设置默认结果,默认结果显示为空

有没有办法在R中创建一张具有多个色标的热图?

更新文本区域行号

使用props 将VUE 3组件导入JS文件

当达到高度限制时,如何裁剪图像?使用html和css

如何使pdf.js上的文本呈现为可选?

使用Java脚本在div中创建新的span标记

由于http.get,*ngIf的延迟很大