jose охватывает всё семейство JOSE — подписанные и зашифрованные токены, импорт и экспорт JWK, локальные и удалённые наборы JWK — с одним API в любой среде выполнения JavaScript. Начиная с версии 6 вся криптография выполняется через WebCrypto, поэтому ключи — это объекты CryptoKey (экземпляры KeyObject из Node.js по-прежнему принимаются), а библиотека наследует список кривых WebCrypto: ES256, ES384 и ES512, EdDSA и Ed25519, а в версии 6.2.13 — алгоритмы ML-DSA там, где их предоставляет среда выполнения. ES256K и Ed448 отклоняются с ошибкой ERR_JOSE_NOT_SUPPORTED.
Там, где это важно, настройки по умолчанию строгие. jwtVerify() никогда не принимает alg: none (неподписанные токены можно прочитать только через отдельный класс UnsecuredJWT), а ключ привязан к одному семейству алгоритмов, поэтому токен HS256, предъявленный с открытым ключом EC, или токен RS256 с ключом EC не проходит проверку: возникает ошибка TypeError. ES256 также не принимает ключ P-384. И всё же передавайте algorithms: когда в наборе ключей есть ключи нескольких типов, именно этот параметр не даёт издателю незаметно сменить алгоритм.
Две настройки по умолчанию противоположны по строгости. clockTolerance равен нулю, и это строго, а exp необязателен, и это нестрого: токен без срока действия проходит проверку, если не указать это утверждение в requiredClaims, как это делает пример. JWS, подпись ECDSA в котором пришла в DER (типичная ситуация, когда токен собирают вручную с помощью облачного KMS или openssl dgst), не проходит проверку с общей ошибкой signature verification failed, и ничто не указывает на кодировку; отладчик JWT сразу показывает длину подписи, а конвертер DER ⇄ raw исправляет кодировку.
Импорт ключей явный: importSPKI и importPKCS8 принимают строки PEM (байты DER отклоняются с ошибкой "spki" must be SPKI formatted string), importX509 — сертификат PEM, а importJWK — JWK. importPKCS8 не принимает файлы SEC1 EC PRIVATE KEY, которые OpenSSL записывает по умолчанию; сначала преобразуйте их в PKCS#8, например с помощью конвертера JWK.
Для проверки токенов от поставщика удостоверений используйте createRemoteJWKSet с jwks_uri поставщика: эта функция кеширует ключи, загружает набор заново при неизвестном kid и применяет к повторным загрузкам ограничение частоты запросов. Что на самом деле публикует поставщик, покажет проверка JWKS.