php-jwt kodiert und dekodiert Tokens mit JWT::encode() und JWT::decode() auf Basis der openssl-Erweiterung und von libsodium. Seit Version 6 ist ein Objekt Key – Schlüsselmaterial plus Algorithmus – Pflicht, sodass der Algorithmus aus deinem Code kommt, nicht aus dem Token: Ein RS256-Token und ein mit dem PEM-Text des EC-Schlüssels gefälschtes HS256-Token scheiterten beide an new Key($pem, 'ES256') mit Incorrect key for this algorithm, und ein unsigniertes Token scheitert mit Algorithm not supported. Dieser Schutz greift nur, solange die Anwendung das Objekt Key selbst erstellt; mit new Key($pem, 'HS256') bestand das gefälschte Token die Prüfung.
Version 7.2.1 unterstützt HS256/384/512, RS256/384/512, ES256, ES384, ES256K und EdDSA. ES512 wird nicht unterstützt (Algorithm not supported), PS256 setzt ein installiertes phpseclib/phpseclib voraus, und PS384 und PS512 sind gar nicht verfügbar – für Tokens von Ausstellern, die diese Algorithmen verwenden, brauchst du web-token oder lcobucci/jwt. HMAC-Schlüssel, die kürzer als der Hash sind, werden abgelehnt (Provided key is too short).
ES256 ist nicht an P-256 gebunden: Ein Token, das mit einem P-384-Schlüssel und ES256 im Header signiert war, wurde von der Bibliothek selbst erzeugt und akzeptiert, obwohl andere Bibliotheken es ablehnen. ES256-Signaturen werden in das 64 Byte lange rohe r‖s umgewandelt, das JWS verlangt; eine DER-Signatur scheitert mit Signature verification failed. Prüfe die Signatur eines Tokens im JWT-Debugger.
Die Behandlung von Claims ist minimal. exp, nbf und iat werden nur geprüft, wenn sie vorhanden sind, JWT::$leeway ist eine globale statische Variable mit dem Standardwert 0, und eine Prüfung von Aussteller oder Audience gibt es überhaupt nicht – das Beispiel prüft exp und iss selbst. Für die Prüfung über JWKS wandelt JWK::parseKeySet() einen Schlüsselsatz in Objekte vom Typ Key um; untersuche den Schlüsselsatz eines Anbieters mit dem JWKS-Checker.