簡體   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