jose couvre toute la famille JOSE (jetons signés et chiffrés, import et export de JWK, jeux de clés JWK locaux et distants) avec une seule API dans tous les environnements d’exécution JavaScript. Depuis la version 6, toute la cryptographie passe par WebCrypto, si bien que les clés sont des objets CryptoKey (les instances KeyObject de Node.js restent acceptées), et la bibliothèque hérite de la liste de courbes de WebCrypto : ES256, ES384 et ES512, EdDSA et Ed25519, ainsi que, dans la 6.2.13, les algorithmes ML-DSA là où l’environnement d’exécution les fournit. ES256K et Ed448 sont refusés avec ERR_JOSE_NOT_SUPPORTED.
Ses valeurs par défaut sont strictes là où cela compte. jwtVerify() n’accepte jamais alg: none (les jetons non signés ne se lisent qu’au moyen de la classe distincte UnsecuredJWT), et une clé est liée à une seule famille d’algorithmes : un jeton HS256 présenté avec une clé publique EC, ou un jeton RS256 avec une clé EC, échoue avec une TypeError au lieu d’être vérifié. ES256 refuse aussi une clé P-384. Passez tout de même algorithms : avec un jeu de clés qui contient plusieurs types de clés, c’est ce qui empêche un émetteur de changer d’algorithme en silence.
Deux valeurs par défaut tirent en sens contraires. clockTolerance vaut zéro, ce qui est strict, et exp est facultatif, ce qui ne l’est pas : un jeton sans expiration est vérifié, sauf si vous ajoutez ce claim à requiredClaims, comme le fait l’exemple. Un JWS dont la signature ECDSA est arrivée en DER (cas typique d’un jeton assemblé à la main avec un KMS cloud ou openssl dgst) échoue avec le message générique signature verification failed, sans rien qui désigne l’encodage ; le débogueur JWT montre la longueur de la signature d’un coup d’œil, et le convertisseur DER ⇄ brut la corrige.
L’import des clés est explicite : importSPKI et importPKCS8 prennent des chaînes PEM (des octets DER sont refusés avec "spki" must be SPKI formatted string), importX509 prend un certificat PEM et importJWK une JWK. Les fichiers SEC1 EC PRIVATE KEY qu’OpenSSL écrit par défaut sont rejetés par importPKCS8 ; convertissez-les d’abord en PKCS#8, par exemple avec le convertisseur JWK.
Pour vérifier des jetons émis par un fournisseur d’identité, utilisez createRemoteJWKSet avec le jwks_uri du fournisseur : la fonction met les clés en cache, les récupère de nouveau face à un kid inconnu et applique une limitation de débit à ces nouvelles récupérations. Vérifiez ce que le fournisseur publie réellement avec le vérificateur JWKS.