Fehlermeldung
secret or public key must be provided
Auch ausgegeben als
- secretOrPrivateKey must have a value
`jwt.sign()` meldet dasselbe Problem als „secretOrPrivateKey must have a value“ (ein einfacher `Error`).
jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify(); the sign() twin is a plain Error
Was der Fehler bedeutet
`jwt.verify()` hat ein signiertes Token erhalten, aber das Schlüsselargument ist leer (`undefined`, `null` oder `""`). Ohne Schlüssel kann jsonwebtoken keine Signatur prüfen, deshalb bricht es ab, bevor es sich das Token ansieht. Die signierende Seite hat ein Gegenstück, `secretOrPrivateKey must have a value`, das `jwt.sign()` aus demselben Grund wirft.
Warum der Fehler auftritt
Die Umgebungsvariable ist hier nicht gesetzt
häufig`process.env.JWT_SECRET` oder `JWT_PUBLIC_KEY` existiert auf dem Entwicklerrechner, aber nicht im Container, im CI-Job oder in der Serverless-Funktion. In den Dashboards der Plattformen gelten Variablen oft nur für eine bestimmte Umgebung (Preview oder Production).
.env wird erst geladen, nachdem der Wert gelesen wurde
häufigEin Modul, das `process.env.JWT_SECRET` beim Import liest, hält `undefined` fest, wenn `dotenv` erst später in der Einstiegsdatei konfiguriert wird. Bei ES-Modulen werden Importe ausgewertet, bevor der Code der importierenden Datei läuft.
Ein Schlüssel-Callback hat nichts geliefert
gelegentlichBei einer Funktion `getKey(header, callback)` (etwa auf Basis von jwks-rsa) erzeugt der Aufruf `callback(null, undefined)` – weil eine Suche keinen Schlüssel ergab – diesen Fehler statt eines Fehlers „Schlüssel nicht gefunden“.
So behebst du den Fehler
- 1.
Konfiguration beim Start validieren
Lies die benötigten Schlüssel einmal beim Start des Prozesses und beende ihn mit einer klaren Meldung, wenn einer fehlt. Eine falsch konfigurierte Instanz nimmt dann gar nicht erst Anfragen an.
js function requireEnv(name) { const value = process.env[name]; if (!value) throw new Error(name + " is not set"); return value; } const JWT_PUBLIC_KEY = requireEnv("JWT_PUBLIC_KEY"); // evaluated once at startup - 2.
.env-Dateien vor allem anderen laden
Importiere `dotenv/config` als allerersten Import oder nutze das eingebaute Flag `--env-file` von Node, damit jedes Modul die Werte sieht.
js // Load .env before any module that reads process.env at import time. import "dotenv/config"; import { app } from "./app.js"; // Node 20.6+: no package needed // node --env-file=.env server.js