0

编辑:当我减小有效载荷大小时它会起作用......为什么?

这到底是怎么回事?为什么它突然停止工作?

我正在尝试解码 JWT 令牌,但出现错误。甚至 VS Code 也显示一个。

The signature '(data: string): string' of 'atob' is deprecated.

怎么可能atob在另一个项目中起作用,而不是在这个项目中?

let payload = tokenRaw.split(".")[1];
let decoded = atob(payload);
let token = JSON.parse(decoded);

这是 JWT 创建的。

不工作

let token = jwt.sign(
    {
        username: req.body.username,
        companyKey: user.companyKey,
        companyName: user.companyName,
        discountGroup: user.discountGroup,
        isAdmin: false,
    },
        config.tokenSecret,
    {
        expiresIn: tokenExpirationSeconds,
    }
);

在职的

let token = jwt.sign(
    {
        username: req.body.username,
        companyKey: user.companyKey,
    },
        config.tokenSecret,
    {
        expiresIn: tokenExpirationSeconds,
    }
);
4

1 回答 1

0

看来您的帖子实际上有两个问题。VS Code 显示的那个...

'atob' 的签名 '(data: string): string' 已弃用。

...与运行时无关,因此是恒定的。其根本原因在母舰本身打开的票中进行了描述:

问题是两个“重载”在签名上是相同的,并且节点中已弃用的一个被选中,因为它是最后加载的。如果你正在编写 DOM 代码,你真的应该尽量避免在程序中使用节点类型,但我们痛苦地意识到这说起来容易做起来难,有时甚至是不可能的。

建议的解决方案是使用window.atob(),以便 TS 清楚地知道节点的签名不应该适用。


真正成为标题的问题 -

要解码的字符串未正确编码。

... 不是静态的,取决于有效载荷的准备方式。它似乎与此线程中描述的问题有些相关,但没有确切的输入,很难说。例如,它也可能与请求参数的不当处理有关。

所以建议是将这段代码包装成try-catch一种或另一种方式。例如,如果它是一个函数...

function decodeRawToken(tokenRaw) {
  try {
    let payload = tokenRaw.split(".")[1];
    let decoded = atob(payload);
    let token = JSON.parse(decoded);
    return token;
  }
  catch(e) {
    console.error(`Failed to process token: ${tokenRaw}`);
    // you can send this token to some server-side logger instead
  }
}

...这样您就可以始终检测哪些令牌给您的代码带来了问题 - 并与他们的发起人协商他们的一代出了什么问题。

于 2021-11-03T13:32:38.723 回答