php-jwt encode et décode des jetons avec JWT::encode() et JWT::decode(), en s’appuyant sur l’extension openssl et libsodium. Depuis la version 6, un objet Key (matériel de clé et algorithme) est obligatoire : l’algorithme vient donc de votre code, et non du jeton. Un jeton RS256 et un jeton HS256 forgé avec le texte PEM de la clé EC ont tous deux échoué face à new Key($pem, 'ES256') avec Incorrect key for this algorithm, et un jeton non signé échoue avec Algorithm not supported. Cette protection ne tient que tant que c’est l’application qui construit la Key ; new Key($pem, 'HS256') a vérifié le jeton forgé.
La version 7.2.1 gère HS256/384/512, RS256/384/512, ES256, ES384, ES256K et EdDSA. ES512 n’est pas pris en charge (Algorithm not supported), PS256 nécessite l’installation de phpseclib/phpseclib, et PS384 et PS512 ne sont pas disponibles du tout : les jetons d’émetteurs qui utilisent ces algorithmes nécessitent web-token ou lcobucci/jwt. Les clés HMAC plus courtes que le condensat sont rejetées (Provided key is too short).
ES256 n’est pas lié à P-256 : un jeton signé avec une clé P-384 sous un en-tête ES256 a été produit puis accepté par la bibliothèque elle-même, alors que d’autres bibliothèques le refusent. Les signatures ES256 sont converties dans le r‖s brut de 64 octets qu’exige JWS ; une signature DER échoue avec Signature verification failed. Vérifiez la signature d’un jeton dans le débogueur JWT.
Le traitement des claims est minimal. exp, nbf et iat ne sont vérifiés que s’ils sont présents, JWT::$leeway est une propriété statique globale qui vaut 0 par défaut, et l’émetteur comme l’audience ne sont pas du tout validés : l’exemple vérifie lui-même exp et iss. Pour une vérification fondée sur JWKS, JWK::parseKeySet() transforme un jeu de clés en objets Key ; examinez le jeu de clés d’un fournisseur avec le vérificateur JWKS.