JWCrypto реализует семейство JOSE поверх pyca/cryptography: JWK и наборы JWK, JWS, JWE и JWT. Всё построено на объектах ключей — jwk.JWK, созданных из PEM, JSON или через generate(), поэтому тип ключа явно виден при каждом вызове. Библиотека выпущена под лицензией LGPL-3.0-or-later; это важно, если вы распространяете изменённые копии.
Среди библиотек JOSE для Python у неё самый широкий набор алгоритмов: семейства HS, RS, PS и ES, ES256K, EdDSA и полностью определённые Ed25519 и Ed448, а в версии 1.6.1 ещё и ML-DSA-44, ML-DSA-65 и ML-DSA-87 с ключами AKP из черновика постквантового JOSE; в ходе проверки подпись и проверка подписи прошли для всех, и все они входят в список разрешённых по умолчанию. В этом списке по умолчанию и кроется подвох: если не передать algs, для подходящего ключа принимается любой из этих алгоритмов, поэтому сузьте список до тех, которые на самом деле использует ваш издатель, как это делает пример.
Неподписанные токены отклоняются с ошибкой Algorithm not allowed, если none нет в списке, а токен HS256, предъявленный с открытым ключом EC в формате JWK, не проходит проверку, потому что ключ этого типа не может выполнять HMAC. ES256 не принимает ключ P-384 и выдаёт Curve requested is "P-256", but key curve is "P-384". Подписи ES256 — это 64-байтовый формат raw r‖s; подпись DER не проходит проверку с ошибкой Verification failed for all signatures, а кодировку можно проверить в отладчике JWT.
Две настройки по умолчанию отличаются от принятых в других библиотеках. Проверка срока действия допускает расхождение часов в 60 секунд: токен, срок действия которого истёк 57 секунд назад, всё ещё прошёл проверку, а просроченный на 63 секунды — нет; это мягче, чем в PyJWT или jose, где расхождение не допускается вовсе. Кроме того, exp необязателен: токен без него прошёл проверку, если это утверждение не указано в check_claims.
Собирайте наборы ключей в конструкторе JWKS, а зашифрованные токены разбирайте в инспекторе JWE; размеры ключей и подписей ML-DSA показывает песочница постквантовых подписей.