jsonwebtoken кодирует и декодирует JWT с помощью encode, decode и объекта Validation, а утверждения обрабатывает через serde. Начиная с версии 10 криптографию предоставляет бэкенд, который выбирается feature-флагом (aws_lc_rs или rust_crypto); при проверке использовался aws_lc_rs. Если забыть включить feature-флаг, сборка не завершится ошибкой: только с feature-флагами по умолчанию версия 11.1.0 скомпилировалась, а затем при первом вызове encode() завершилась паникой Could not automatically determine the process-level CryptoProvider. Включите ровно один бэкенд, как это сделано в манифесте примера.
Набор алгоритмов — закрытое перечисление: для HS, RS и PS на 256/384/512, ES256, ES384 и EdDSA подпись и проверка прошли успешно, а ES512, ES256K и Ed25519 вообще не входят в число вариантов. Варианта none тоже нет, поэтому неподписанный токен не проходит уже разбор заголовка: возникает ошибка unknown variant none. Список разрешённых алгоритмов задаёт Validation::new(alg): проверка токена HS256 с Validation::new(ES256) завершилась ошибкой InvalidAlgorithm, и даже когда разрешены оба алгоритма, токен HS256, подписанный текстом PEM открытого ключа EC, не прошёл проверку с ошибкой InvalidKeyFormat, потому что DecodingKey для EC не может служить секретом HMAC.
Утверждения проверяются строже, чем в большинстве библиотек: токен без exp не проходит проверку с ошибкой Missing required claim: exp, а допуск на расхождение часов по умолчанию равен 60 секундам — токен, срок действия которого истёк 57 секунд назад, всё ещё прошёл проверку. Уменьшите leeway и задайте издателя и аудиторию в Validation, как это делает пример. ES256 не принимает ключ P-384 уже при подписи и выдаёт InvalidEcdsaKey.
Подписи ES256 — это 64-байтовый формат raw r‖s, которого требует JWS, а подпись DER не проходит проверку с ошибкой InvalidSignature. Ключи загружаются из PEM (from_ec_pem, from_rsa_pem, from_ed_pem) и DER; для Ed25519 в формате DER ключ кодирования принял PKCS#8, а ключ декодирования — 32-байтовый открытый ключ в формате raw. Разбирайте токены в отладчике JWT, а секреты HMAC проверяйте инструментом проверки секретов JWT.
Для подписей вне JWT используйте крейты бэкендов напрямую: aws-lc-rs или RustCrypto ecdsa.