Перейти к содержимому
ecdsa.com
jsonwebtoken (Node.js)Библиотеки JWT

Сообщение об ошибке

invalid signature

Что это означает

Токен разобран без ошибок, и его структура корректна, но криптографическая проверка не прошла: подпись заголовка и полезной нагрузки (header.payload) не проходит проверку переданным вами ключом. Либо это не тот ключ, которым подписан токен, либо подписанные байты изменились после подписания.

Почему это происходит

Как исправить

  1. 1.

    Сравните отпечатки ключа на обеих сторонах

    Вычислите хеш открытого ключа, который на самом деле загрузила проверяющая сторона, и сравните его с хешем ключа издателя. Разные отпечатки означают устаревший или не тот ключ (безусловно самую частую причину) и завершают поиск за один шаг.

    js
    import { createHash, createPublicKey } from "node:crypto";
    
    // Run on the verifier, and on the issuer with its signing key: the outputs must match.
    const spki = createPublicKey(process.env.JWT_PUBLIC_KEY).export({ type: "spki", format: "der" });
    console.log(createHash("sha256").update(spki).digest("hex"));
  2. 2.

    Сопоставьте kid токена с ключом проверки

    Декодируйте заголовок без проверки и сравните его kid с ключом, который есть у вас. Если издатель публикует JWKS, выбирайте ключ по kid, а не прописывайте его в коде.

    js
    const { header } = jwt.decode(token, { complete: true });
    console.log(header.kid, header.alg); // compare with your JWKS / configured key
  3. 3.

    Пусть отладчик назовёт расхождение

    Вставьте токен и открытый ключ в отладчик JWT: он локально проверяет ES256/ES384/ES512 и не ограничивается ответом «да/нет», а различает неверный ключ, подменённую полезную нагрузку и некорректную кодировку подписи.

Связанные ошибки

Открыть всю базу ошибок подписей