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
Une chaîne PEM a été passée directement
fréquenteLe code migré depuis jsonwebtoken, qui accepte du texte PEM, passe souvent `process.env.PUBLIC_KEY` directement à `jwtVerify`. jose exige d’abord `importSPKI` (clés publiques), `importPKCS8` (clés privées) ou `importX509` (certificats).
Un secret HMAC a été passé sous forme de chaîne
fréquentePour HS256/HS384/HS512, le secret doit être fourni sous forme d’octets : `new TextEncoder().encode(secret)`. La chaîne elle-même est rejetée, même s’il s’agit du bon secret.
Une chaîne d’URL JWKS au lieu d’une fonction de jeu de clés
occasionnelle`"https://issuer/.well-known/jwks.json"` est une chaîne, pas une clé. Enveloppez-la avec `createRemoteJWKSet(new URL(...))`, qui renvoie la fonction qu’attend `jwtVerify`.
La valeur de configuration est manquante
occasionnelleUne variable d’environnement non définie donne `undefined`, qui échoue au même contrôle de type. Validez la configuration au démarrage pour que l’erreur nomme plutôt la variable manquante.
Comment corriger l’erreur
- 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.
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.
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"] });