В основе системы обработки ошибок в библиотеке лежит
JOSEError — общий предок для всех исключений, связанных с
операциями над JWS (подписи), JWE (шифрование) и JWT (токены).
JOSEError наследуется от стандартного Error
и служит маркером для всех криптографических и структурных ошибок,
возникающих внутри библиотеки jose.
Ключевая особенность: любые специфические ошибки (подпись,
расшифровка, валидация claims) всегда можно отловить через проверку на
instanceof JOSEError, не разбирая каждую разновидность
отдельно.
import { JOSEError } from 'jose';
try {
// операции с JWT / JWS / JWE
} catch (err) {
if (err instanceof JOSEError) {
// обработка всех ошибок jose
}
}
Библиотека строит строгую иерархию исключений. Это важно для точного разделения причин сбоя:
JOSEError — базовый класс
JWSInvalid
JWSSignatureVerificationFailedJWEInvalid
JWEDecryptionFailedJWTInvalid
JWTExpiredJWTClaimValidationFailedJWTMalformedТакая структура позволяет различать:
JOSEError не используется напрямую как сигнал конкретной
проблемы. Его роль — унификация обработки.
Типичные свойства:
name — имя ошибки (строка)message — описание причиныcode — машинно-ориентированный код (в некоторых
версиях)try {
// verify / decrypt / decode
} catch (e) {
if (e instanceof JOSEError) {
console.error(e.message);
}
}
JWS (JSON Web Signature) отвечает за проверку подписи токена.
Базовая ошибка для всех проблем с JWS-структурой.
Причины:
Возникает при неуспешной проверке подписи.
Причины:
import { jwtVerify } from 'jose';
try {
await jwtVerify(token, publicKey);
} catch (err) {
if (err.name === 'JWSSignatureVerificationFailed') {
// токен подделан или ключ неверный
}
}
JWE (JSON Web Encryption) отвечает за шифрование и расшифровку данных.
Базовый класс ошибок JWE-слоя.
Причины:
Одна из наиболее частых ошибок при работе с JWE.
Причины:
alg или encimport { jwtDecrypt } from 'jose';
try {
await jwtDecrypt(token, privateKey);
} catch (err) {
if (err.name === 'JWEDecryptionFailed') {
// невозможно расшифровать токен
}
}
JWT в библиотеке jose строится поверх JWS/JWE и добавляет проверку claims.
Общий тип ошибок JWT-валидации.
Причины:
Возникает при превышении срока действия токена
(exp).
try {
await jwtVerify(token, key);
} catch (err) {
if (err.name === 'JWTExpired') {
// токен устарел
}
}
Особенность: проверка exp происходит автоматически при
валидации.
Ошибка возникает при несоответствии claims ожидаемым значениям.
Типичные случаи:
aud не совпадает с ожидаемымiss не соответствует доверенному issuersub отсутствует или некорректенawait jwtVerify(token, key, {
issuer: 'https://auth.server'
});
Если iss отличается — выбрасывается
JWTClaimValidationFailed.
Ошибка структуры JWT до стадии криптографической проверки.
Причины:
Корректная стратегия обработки ошибок в приложениях, использующих
jose, обычно строится на двух уровнях:
import { JOSEError } from 'jose';
try {
await jwtVerify(token, key);
} catch (err) {
if (err instanceof JOSEError) {
// логирование и единый формат ответа
}
}
catch (err) {
if (err.name === 'JWTExpired') {
// refresh token flow
}
if (err.name === 'JWSSignatureVerificationFailed') {
// возможная атака или неверный ключ
}
}
В сложных сценариях (например, decrypt → verify → validate claims) ошибка может возникать на разных уровнях:
Важно: библиотека не агрегирует ошибки в одну — всегда возвращается первая критическая точка сбоя.
Создаётся единая функция обработки JOSE-ошибок:
function handleJoseError(err) {
switch (err.name) {
case 'JWTExpired':
return { status: 401, reason: 'expired' };
case 'JWSSignatureVerificationFailed':
return { status: 401, reason: 'invalid_signature' };
case 'JWEDecryptionFailed':
return { status: 400, reason: 'decrypt_failed' };
default:
return { status: 500, reason: 'unknown_jose_error' };
}
}
Ошибки JOSE часто делят на два класса:
критические безопасности
логические (claims)
Такое разделение влияет на:
При работе с JOSEError важны следующие аспекты:
name ошибки является основным идентификатором типа
проблемыJOSEError не просто программное исключение, а отражение
состояния криптографической операции:
Эта модель позволяет использовать библиотеку как строгий слой безопасности, где каждая ошибка является результатом конкретного криптографического контракта.