php-jwt は、openssl 拡張モジュールと libsodium を基盤に、JWT::encode() と JWT::decode() でトークンをエンコード・デコードします。バージョン 6 からは Key オブジェクト(鍵データとアルゴリズムの組)が必須になったため、アルゴリズムはトークンではなくアプリケーションのコードで決まります。RS256 トークンと、EC 鍵の PEM テキストで偽造した HS256 トークンは、どちらも new Key($pem, 'ES256') に対して Incorrect key for this algorithm で失敗し、署名のないトークンは Algorithm not supported で失敗します。ただし、この保護が有効なのはアプリケーション側が Key を構築している場合だけです。new Key($pem, 'HS256') では偽造したトークンが検証を通りました。
バージョン 7.2.1 は HS256/384/512、RS256/384/512、ES256、ES384、ES256K、EdDSA に対応しています。ES512 には対応しておらず(Algorithm not supported)、PS256 には phpseclib/phpseclib のインストールが必要で、PS384 と PS512 はまったく使えません。これらのアルゴリズムを使う発行者のトークンには、web-token か lcobucci/jwt が必要です。ハッシュより短い HMAC 鍵は拒否されます(Provided key is too short)。
ES256 は P-256 に限定されていません。ES256 ヘッダーのまま P-384 鍵で署名したトークンを、このライブラリ自身が生成し、受け入れました。他のライブラリはこれを拒否します。ES256 署名は JWS が求める 64 バイトの生の r‖s に変換され、DER 署名は Signature verification failed で失敗します。トークンの署名は JWT デバッガーで確認してください。
クレームの処理は最小限です。exp、nbf、iat は存在する場合にだけチェックされ、JWT::$leeway はデフォルト値が 0 のグローバルな静的プロパティで、発行者とオーディエンスの検証はまったく行われません。そのためサンプルでは exp と iss を自前でチェックしています。JWKS による検証では、JWK::parseKeySet() が鍵セットを Key オブジェクトに変換します。プロバイダーが公開する鍵セットは JWKS チェッカーで確認してください。