Aller au contenu
ecdsa.com
jose (JavaScript)Bibliothèques JWT

Message d’erreur

Key for the ES256 algorithm must be one of type CryptoKey, KeyObject, or JSON Web Key.

Également affiché sous la forme

  • Key for the RS256 algorithm must be one of type CryptoKey, KeyObject, or JSON Web Key.
  • Key for the HS256 algorithm must be one of type CryptoKey, KeyObject, JSON Web Key, or Uint8Array.

L’algorithme mentionné dans la phrase suit votre jeton (`ES256`, `RS256`, `EdDSA`…). Pour les algorithmes HMAC, la liste se termine par « or Uint8Array ».

jose (JavaScript) — TypeError from jwtVerify / SignJWT.sign

Ce que cela signifie

Vous avez passé à jose une valeur qu’il ne peut pas utiliser comme clé – le plus souvent une chaîne PEM ou un secret sous forme de simple chaîne. Depuis la version 4, jose n’accepte que des objets clés : un `CryptoKey` WebCrypto, un `KeyObject` Node.js, un objet JWK ou (pour les algorithmes HMAC) un `Uint8Array`. Les formats texte doivent d’abord être importés ; jose ne devine jamais ce que contient une chaîne.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Importer les clés PEM une seule fois, au démarrage

    `importSPKI` et `importPKCS8` prennent le texte PEM et l’algorithme avec lequel la clé sera utilisée, et renvoient un `CryptoKey` que vous pouvez réutiliser pour chaque requête.

    js
    import { importSPKI, importPKCS8, jwtVerify } from "jose";
    
    const publicKey = await importSPKI(process.env.JWT_PUBLIC_KEY_PEM, "ES256");   // -----BEGIN PUBLIC KEY-----
    await jwtVerify(token, publicKey, { algorithms: ["ES256"] });
    
    const privateKey = await importPKCS8(process.env.JWT_PRIVATE_KEY_PEM, "ES256"); // -----BEGIN PRIVATE KEY-----
  2. 2.

    Encoder les secrets HMAC en octets

    Utilisez un secret aléatoire d’au moins 32 octets pour HS256 et passez-le sous forme de `Uint8Array`. Si le secret est stocké encodé en base64, décodez-le en octets au lieu d’encoder le texte base64.

    js
    import { jwtVerify } from "jose";
    
    const secret = new TextEncoder().encode(process.env.JWT_SECRET); // 32+ random bytes for HS256
    await jwtVerify(token, secret, { algorithms: ["HS256"] });
  3. 3.

    Vérifier avec un jeu de clés, pas avec une URL

    Pour les jetons émis par un fournisseur d’identité, passez la fonction renvoyée par `createRemoteJWKSet` ; jose choisit alors la clé par `kid` pour chaque jeton.

    js
    import { createRemoteJWKSet, jwtVerify } from "jose";
    
    const jwks = createRemoteJWKSet(new URL("https://issuer.example.com/.well-known/jwks.json"));
    await jwtVerify(token, jwks, { algorithms: ["ES256"] });

Erreurs associées

Parcourir toute la base de données des erreurs de signature