Aller au contenu
ecdsa.com
jose (JavaScript)JWKS et découverte des clés

Message d’erreur

multiple matching keys found in the JSON Web Key Set

jose (JavaScript) — JWKSMultipleMatchingKeys, code ERR_JWKS_MULTIPLE_MATCHING_KEYS

Ce que cela signifie

Plus d’une clé du jeu de clés (JSON Web Key Set) pourrait vérifier ce jeton, et jose refuse de deviner. Cela se produit lorsque l’en-tête du jeton n’a pas de `kid` (ou que plusieurs clés partagent le même `kid`) et que le jeu contient au moins deux clés du bon type et de la bonne courbe. jose n’essaie volontairement pas les candidates à votre place dans `jwtVerify` ; l’erreur levée est elle-même un itérateur asynchrone sur les clés candidates, ce qui vous permet de choisir explicitement de les essayer.

Pourquoi cela se produit

Comment corriger l’erreur

  1. 1.

    Identifier la clé de signature dans chaque jeton

    La correction robuste se fait côté émetteur : attribuez à chaque clé un `kid` unique (une empreinte RFC 7638 convient bien), publiez-le dans le JWKS et inscrivez-le dans l’en-tête protégé de chaque jeton.

    js
    import { SignJWT } from "jose";
    
    // Issuer side: name the key in every token, and publish the same kid in the JWKS.
    const token = await new SignJWT(claims)
      .setProtectedHeader({ alg: "ES256", kid: "2026-10" })
      .setExpirationTime("10m")
      .sign(privateKey);
  2. 2.

    Choisir explicitement d’essayer les clés candidates

    Si vous ne pouvez pas modifier l’émetteur, itérez sur l’erreur : jose fournit chaque clé candidate, et vous n’acceptez le jeton que si l’une d’elles le vérifie. Cela coûte une vérification de signature par candidate : gardez donc le jeu de clés réduit.

    js
    import { errors, jwtVerify } from "jose";
    
    async function verifyWithCandidates(token, jwks, options) {
      try {
        return await jwtVerify(token, jwks, options);
      } catch (err) {
        if (err?.code !== "ERR_JWKS_MULTIPLE_MATCHING_KEYS") throw err;
        for await (const publicKey of err) {
          try {
            return await jwtVerify(token, publicKey, options);
          } catch (inner) {
            if (inner?.code === "ERR_JWS_SIGNATURE_VERIFICATION_FAILED") continue;
            throw inner;
          }
        }
        throw new errors.JWSSignatureVerificationFailed();
      }
    }

Erreurs associées

Parcourir toute la base de données des erreurs de signature