lcobucci/jwt разделяет разбор, подпись и проверку: Configuration хранит объект подписи и ключи, parser()->parse() читает токен, ничего не проверяя, а validator()->assert() применяет переданные вами ограничения. Вызов assert() без ограничений выбрасывает NoConstraintsGiven, поэтому случайно написать проверку, которая ничего не проверяет, трудно.
SignedWith фиксирует объект подписи и ключ: и токен RS256, и токен HS256, подделанный с помощью текста PEM ключа EC, не прошли проверку с ошибкой Token signer mismatch. Неподписанные токены не удаётся даже разобрать (The JWT string is missing the Signature part). Размеры ключей проверяются уже при подписи: ES256 отклонил ключ P-384 (The length of the provided key is different than 256 bits), а HS256 — 40-битный ключ, так что некорректные токены вообще не создаются.
Проверки времени — тоже ограничения, поэтому они выполняются, только если их указать: токен, срок действия которого истёк час назад, прошёл проверку, когда было указано только SignedWith. LooseValidAt проверяет exp, nbf и iat, если они есть, и принял токен без exp; StrictValidAt требует все три утверждения — токен без iat не прошёл проверку с ошибкой "Issued At" claim missing, а токен с iat и exp, но без nbf — с ошибкой "Not Before" claim missing. Оба принимают необязательный интервал допуска на расхождение часов, по умолчанию нулевой. Пример задаёт все три утверждения и одним вызовом проверяет подпись, издателя и срок действия в строгом режиме.
Версия 5.6.1 поддерживает HS, RS и ES на 256/384/512 и EdDSA; классов подписи PS* и ES256K нет, поэтому для токенов от издателей, которые используют RSA-PSS, нужен web-token. Подписи ES256 — 64 байта в формате raw r‖s, а подпись DER не проходит проверку с ошибкой Token signature mismatch; какая кодировка в токене, покажет отладчик JWT.