Fehlermeldung
Key for the ES256 algorithm must be one of type CryptoKey, KeyObject, or JSON Web Key.
Auch ausgegeben als
- 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.
Der Algorithmus in der Meldung richtet sich nach deinem Token (`ES256`, `RS256`, `EdDSA`…). Bei HMAC-Algorithmen endet die Liste mit „or Uint8Array“.
jose (JavaScript) — TypeError from jwtVerify / SignJWT.sign
Was der Fehler bedeutet
Du hast jose einen Wert übergeben, den es nicht als Schlüssel verwenden kann – meist einen PEM-String oder ein Secret als einfachen String. Seit Version 4 akzeptiert jose nur Schlüsselobjekte: einen `CryptoKey` aus WebCrypto, ein `KeyObject` aus Node.js, ein JWK-Objekt oder (für HMAC-Algorithmen) ein `Uint8Array`. Textformate müssen zuerst importiert werden; jose rät nie, was ein String enthält.
Warum der Fehler auftritt
Ein PEM-String wurde direkt übergeben
häufigCode, der von jsonwebtoken migriert wurde (das PEM-Text akzeptiert), übergibt `process.env.PUBLIC_KEY` oft direkt an `jwtVerify`. jose verlangt vorher `importSPKI` (öffentliche Schlüssel), `importPKCS8` (private Schlüssel) oder `importX509` (Zertifikate).
Ein HMAC-Secret wurde als String übergeben
häufigFür HS256/HS384/HS512 muss das Secret aus Bytes bestehen: `new TextEncoder().encode(secret)`. Der String selbst wird abgelehnt, obwohl er das richtige Secret ist.
Ein String mit der JWKS-URL statt einer Funktion für den Schlüsselsatz
gelegentlich`"https://issuer/.well-known/jwks.json"` ist ein String, kein Schlüssel. Verpacke ihn mit `createRemoteJWKSet(new URL(...))`; das gibt die Funktion zurück, die `jwtVerify` erwartet.
Der Konfigurationswert fehlt
gelegentlichEine nicht gesetzte Umgebungsvariable ergibt `undefined`, was an derselben Typprüfung scheitert. Validiere die Konfiguration beim Start, damit der Fehler stattdessen die fehlende Variable nennt.
So behebst du den Fehler
- 1.
PEM-Schlüssel einmal beim Start importieren
`importSPKI` und `importPKCS8` nehmen den PEM-Text und den Algorithmus entgegen, mit dem der Schlüssel verwendet werden soll, und geben einen `CryptoKey` zurück, den du für jede Anfrage wiederverwenden kannst.
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.
HMAC-Secrets als Bytes kodieren
Verwende für HS256 ein zufälliges Secret mit mindestens 32 Byte und übergib es als `Uint8Array`. Ist das Secret base64-kodiert gespeichert, dekodiere es in Bytes, statt den base64-Text zu kodieren.
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.
Gegen einen Schlüsselsatz prüfen, nicht gegen eine URL
Übergib für Tokens von einem Identity Provider die Funktion, die `createRemoteJWKSet` zurückgibt; jose wählt dann für jedes Token den Schlüssel anhand von `kid`.
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"] });