繁体   English   中英

DOMException: 无法在 'Window' 上执行 'atob':要解码的字符串未正确编码。 有效载荷大小有问题吗?

[英]DOMException: Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded. Payload size a problem?

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

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

我正在尝试解码 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,
    }
);

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

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

...与运行时无关,因此是常数。 在母舰本身打开的一张票中描述了这种情况的根本原因:

问题是这两个“重载”在签名上是相同的,并且从 node中选择了已弃用的一个,因为它是最后加载的。 如果您正在编写 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
  }
}

...以便您始终可以检测哪些令牌给您的代码带来了问题 - 并与他们的发起者协商他们的生成出了什么问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM