Zum Inhalt springen
ecdsa.com
jose (JavaScript)JWT-Bibliotheken

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

So behebst du den Fehler

  1. 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. 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. 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"] });

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen