Message d’erreur
Expected 200 OK from the JSON Web Key Set HTTP response
jose (JavaScript) — JOSEError from createRemoteJWKSet, code ERR_JOSE_GENERIC
Ce que cela signifie
`createRemoteJWKSet` a demandé l’URL du jeu de clés et a reçu un statut HTTP autre que 200. jose récupère le JWKS avec les redirections désactivées (`redirect: "manual"`) : un 301/302 compte donc comme un échec, au même titre qu’un 404 ou un 401. Aucune clé n’a été chargée et aucune signature de jeton n’a été vérifiée ; l’URL que vous avez configurée ne répond pas avec un jeu de clés.
Pourquoi cela se produit
L’URL configurée n’est pas le jwks_uri
fréquenteChaque fournisseur utilise son propre chemin : 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`. Faire pointer jose vers l’URL de l’émetteur ou vers le document de découverte lui-même renvoie un 404 ou une réponse qui n’est pas un JWKS.
Le point de terminaison répond par une redirection
fréquenteLes redirections de HTTP vers HTTPS, une redirection liée à la barre oblique finale ou un CDN qui a déplacé le fichier répondent tous en 30x. Les navigateurs et curl les suivent sans rien signaler ; jose ne le fait pas, l’URL doit donc être l’URL finale.
Le jeu de clés est derrière une authentification ou une politique réseau
occasionnelleLes fournisseurs d’identité internes se trouvent parfois derrière une passerelle d’API qui exige des identifiants (401/403), ou bien un proxy de sortie répond avec sa propre page d’erreur. Un JWKS est une donnée publique et devrait être accessible sans identifiants depuis chaque vérificateur.
Récupérations trop fréquentes
rareUn vérificateur qui crée un nouvel objet JWKS distant à chaque requête récupère de nouveau le jeu à chaque fois et peut se heurter à une limite de requêtes (429). Créez l’objet une seule fois et réutilisez-le pour que son cache fonctionne.
Comment corriger l’erreur
- 1.
Lire jwks_uri dans le document de découverte
Les fournisseurs OpenID Connect publient l’URL exacte du jeu de clés sous `jwks_uri` dans `/.well-known/openid-configuration`. Résolvez-la une seule fois au démarrage et passez cette URL à `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.
Vérifier le code de statut sans suivre les redirections
curl sans `-L` se comporte comme jose. Un 200 avec `{"keys":[...]}` est ce qu’il vous faut ; un 30x vous indique l’URL à configurer à la place.
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