Fehlermeldung
Expected 200 OK from the JSON Web Key Set HTTP response
jose (JavaScript) — JOSEError from createRemoteJWKSet, code ERR_JOSE_GENERIC
Was der Fehler bedeutet
`createRemoteJWKSet` hat die URL des Schlüsselsatzes angefragt und einen anderen HTTP-Status als 200 erhalten. jose ruft das JWKS mit deaktivierten Weiterleitungen ab (`redirect: "manual"`), deshalb zählt ein 301/302 genauso als Fehlschlag wie ein 404 oder 401. Es wurde kein Schlüssel geladen und keine Token-Signatur geprüft; die von dir konfigurierte URL antwortet nicht mit einem Schlüsselsatz.
Warum der Fehler auftritt
Die konfigurierte URL ist nicht die jwks_uri
häufigJeder Provider verwendet einen eigenen Pfad: Auth0 `/.well-known/jwks.json`, Keycloak `/realms/<realm>/protocol/openid-connect/certs`, Entra ID `/<tenant>/discovery/v2.0/keys`, Google `https://www.googleapis.com/oauth2/v3/certs`. Verweist du jose auf die URL des Ausstellers oder auf das Discovery-Dokument selbst, kommt 404 oder eine Antwort, die kein JWKS ist.
Der Endpunkt antwortet mit einer Weiterleitung
häufigWeiterleitungen von HTTP auf HTTPS, eine Weiterleitung wegen eines abschließenden Schrägstrichs oder ein CDN, das die Datei verschoben hat, antworten alle mit 30x. Browser und curl folgen ihnen stillschweigend; jose nicht, deshalb muss die URL die endgültige sein.
Der Schlüsselsatz liegt hinter einer Authentifizierung oder einer Netzwerkrichtlinie
gelegentlichInterne Identity Provider liegen manchmal hinter einem API-Gateway, das Zugangsdaten verlangt (401/403), oder ein Egress-Proxy antwortet mit einer eigenen Fehlerseite. Ein JWKS besteht aus öffentlichen Daten und sollte für jede prüfende Seite ohne Zugangsdaten erreichbar sein.
Zu viele Abrufe
seltenEine prüfende Seite, die pro Anfrage ein neues Remote-JWKS-Objekt erzeugt, ruft den Satz jedes Mal neu ab und kann gedrosselt werden (429). Erzeuge das Objekt einmal und verwende es wieder, damit sein Cache greift.
So behebst du den Fehler
- 1.
jwks_uri aus dem Discovery-Dokument lesen
Provider für OpenID Connect veröffentlichen die genaue URL des Schlüsselsatzes als `jwks_uri` in `/.well-known/openid-configuration`. Ermittle sie einmal beim Start und übergib diese URL an `createRemoteJWKSet`.
js import { createRemoteJWKSet } from "jose"; // Resolve jwks_uri from the provider's discovery document instead of guessing it. const discovery = await fetch("https://login.example.com/.well-known/openid-configuration").then((r) => r.json()); const jwks = createRemoteJWKSet(new URL(discovery.jwks_uri)); - 2.
Statuscode prüfen, ohne Weiterleitungen zu folgen
curl ohne `-L` verhält sich wie jose. Ein 200 mit `{"keys":[...]}` ist das, was du brauchst; ein 30x nennt dir die URL, die du stattdessen konfigurieren musst.
bash # Status line and redirect target, without following redirects (jose does not follow them either) curl -sS -o /dev/null -w '%{http_code} %{redirect_url}\n' https://login.example.com/jwks curl -s https://login.example.com/.well-known/openid-configuration | jq -r .jwks_uri