php-jwt codifica y decodifica tokens con JWT::encode() y JWT::decode() sobre la extensión openssl y libsodium. Desde la versión 6 es obligatorio un objeto Key —material de clave más algoritmo—, de modo que el algoritmo sale de tu código, no del token: un token RS256 y un token HS256 falsificado con el texto PEM de la clave EC fallaron ambos contra new Key($pem, 'ES256') con Incorrect key for this algorithm, y un token sin firmar falla con Algorithm not supported. La protección solo se mantiene mientras sea la aplicación quien construya el objeto Key; new Key($pem, 'HS256') verificó el token falsificado.
La versión 7.2.1 admite HS256/384/512, RS256/384/512, ES256, ES384, ES256K y EdDSA. ES512 no se admite (Algorithm not supported), PS256 necesita tener instalado phpseclib/phpseclib, y PS384 y PS512 no están disponibles en absoluto: los tokens de emisores que usan esos algoritmos necesitan web-token o lcobucci/jwt. Las claves HMAC más cortas que el hash se rechazan (Provided key is too short).
ES256 no está ligado a P-256: la propia biblioteca produjo y aceptó un token firmado con una clave P-384 bajo un encabezado ES256, aunque otras bibliotecas lo rechazan. Las firmas ES256 se convierten al r‖s en bruto de 64 bytes que exige JWS; una firma DER falla con Signature verification failed. Comprueba la firma de un token en el decodificador de JWT.
El manejo de los claims es mínimo. exp, nbf e iat solo se comprueban si están presentes, JWT::$leeway es una variable estática global con valor predeterminado 0, y no hay ninguna validación de emisor ni de audiencia: el ejemplo comprueba exp e iss por su cuenta. Para la verificación basada en JWKS, JWK::parseKeySet() convierte un conjunto de claves en objetos Key; inspecciona el conjunto de un proveedor con el comprobador de JWKS.