Skip to content

Ошибки

Сигнальные ошибки

Все ошибки проверяются с помощью errors.Is():

go
var (
    ErrInvalidConfig        = errors.New("invalid configuration")
    ErrInvalidSecretKey     = errors.New("invalid secret key")
    ErrInvalidSigningMethod = errors.New("invalid signing method")

    ErrInvalidToken          = errors.New("invalid token")
    ErrEmptyToken            = errors.New("empty token")
    ErrAlgorithmMismatch     = errors.New("token algorithm does not match configured signing method")
    ErrTokenRevoked          = errors.New("token revoked")
    ErrTokenMissingID        = errors.New("token missing ID")
    ErrTokenTypeMismatch     = errors.New("token type mismatch")
    ErrTokenExpired          = errors.New("token expired")
    ErrTokenNotValidYet      = errors.New("token not valid yet")
    ErrTokenInvalidIssuer    = errors.New("token invalid issuer")
    ErrTokenInvalidAudience  = errors.New("token invalid audience")
    ErrExpirationRequired    = errors.New("token missing expiration claim")

    ErrInvalidClaims = errors.New("invalid claims")

    ErrRateLimitExceeded = errors.New("rate limit exceeded")

    ErrBlacklistNotConfigured = errors.New("blacklist not configured")

    ErrProcessorClosed = errors.New("processor closed")
    ErrStoreClosed     = errors.New("blacklist store is closed")
)

Обзор ошибок

ОшибкаОписаниеПроверка через errors.Is()
ErrInvalidConfigНедопустимая конфигурацияNew(), Config.Validate()
ErrInvalidSecretKeyНедействительный ключNew()
ErrInvalidSigningMethodНедействительный метод подписиNew()
ErrInvalidTokenНедействительный токен (ошибка подписи и т.д.)Validate(), Refresh(), ValidateInto(), RefreshInto(), Revoke(), IsRevoked()
ErrEmptyTokenПустой токенВсе методы операций с токенами
ErrAlgorithmMismatchАлгоритм токена не совпадает с конфигурациейValidate(), Refresh(), ValidateInto(), RefreshInto()
ErrTokenRevokedТокен отозванValidate(), Refresh(), ValidateInto(), RefreshInto()
ErrTokenMissingIDВ токене отсутствует IDRevoke(), IsRevoked()
ErrTokenTypeMismatchНесоответствие типа токена (обновление токеном доступа)Refresh(), RefreshInto()
ErrTokenExpiredТокен истёкValidate(), Refresh(), ValidateInto(), RefreshInto()
ErrTokenNotValidYetТокен ещё не действителенValidate(), Refresh(), ValidateInto(), RefreshInto()
ErrTokenInvalidIssuerИздатель не совпадаетValidate(), Refresh(), ValidateInto(), RefreshInto(), Revoke(), IsRevoked()
ErrTokenInvalidAudienceАудитория не совпадаетValidate(), Refresh(), ValidateInto(), RefreshInto(), Revoke(), IsRevoked()
ErrExpirationRequiredRequireExpiration включён, но в токене отсутствует expValidate(), Refresh(), ValidateInto(), RefreshInto()
ErrInvalidClaimsВалидация Claims не удаласьCreate(), CreateRefresh(), Validate(), Refresh(), ValidateInto(), RefreshInto()
ErrRateLimitExceededПревышено ограничение скоростиCreate(), CreateRefresh(), Refresh(), RefreshInto()
ErrBlacklistNotConfiguredЧёрный список не настроенRevoke()
ErrProcessorClosedProcessor закрытВсе методы
ErrStoreClosedХранилище закрытоRevoke() и другие

Классификация по сценариям

Этап конфигурации

ОшибкаВызывающий методТипичная причина
ErrInvalidConfigNew()Несколько недопустимых параметров конфигурации
ErrInvalidSecretKeyNew()HMAC-ключ менее 32 байт или слабый ключ
ErrInvalidSigningMethodNew()Не входит в число 12 встроенных алгоритмов

Проверка токенов

ОшибкаВызывающий методТипичная причина
ErrEmptyTokenВсе методы операций с токенамиПередана пустая строка
ErrInvalidTokenValidate(), Refresh(), ValidateInto(), RefreshInto(), Revoke(), IsRevoked()Подпись не совпадает или формат ошибочен
ErrAlgorithmMismatchValidate(), Refresh(), ValidateInto(), RefreshInto()Алгоритм в заголовке токена не совпадает с конфигурацией
ErrExpirationRequiredValidate(), Refresh(), ValidateInto(), RefreshInto()RequireExpiration включён, но в токене отсутствует утверждение exp
ErrTokenExpiredValidate(), Refresh(), ValidateInto(), RefreshInto()Превышено время exp
ErrTokenNotValidYetValidate(), Refresh(), ValidateInto(), RefreshInto()Ещё не наступило время nbf
ErrTokenInvalidIssuerValidate(), Refresh(), ValidateInto(), RefreshInto(), Revoke(), IsRevoked()iss не совпадает с Config.Issuer
ErrTokenInvalidAudienceValidate(), Refresh(), ValidateInto(), RefreshInto(), Revoke(), IsRevoked()aud не совпадает с Config.ExpectedAudience
ErrTokenRevokedValidate(), Refresh(), ValidateInto(), RefreshInto()Токен находится в чёрном списке
ErrTokenTypeMismatchRefresh(), RefreshInto()Обновление токеном доступа (token_type=access)
ErrInvalidClaimsCreate(), CreateRefresh(), Validate(), Refresh(), ValidateInto(), RefreshInto()Бизнес-валидация не удалась
ErrTokenMissingIDRevoke(), IsRevoked()В токене отсутствует поле jti

Ограничение скорости и чёрный список

ОшибкаВызывающий методТипичная причина
ErrRateLimitExceededCreate(), CreateRefresh(), Refresh(), RefreshInto()Превышен лимит запросов в окне
ErrBlacklistNotConfiguredRevoke()Хранилище чёрного списка не настроено
ErrTokenMissingIDRevoke(), IsRevoked()В токене отсутствует поле jti

Жизненный цикл

ОшибкаВызывающий методТипичная причина
ErrProcessorClosedВсе методыПродолжение работы после вызова Close()
ErrStoreClosedRevoke() и другиеХранилище чёрного списка закрыто

Шаблон обработки ошибок

go
import "errors"

claims, valid, err := processor.Validate(tokenString)
if err != nil {
    switch {
    case errors.Is(err, jwt.ErrTokenExpired):
        // Токен истёк — направить пользователя на обновление
    case errors.Is(err, jwt.ErrTokenRevoked):
        // Токен отозван — отказать в доступе
    case errors.Is(err, jwt.ErrInvalidToken):
        // Подпись недействительна — отказать в доступе
    case errors.Is(err, jwt.ErrProcessorClosed):
        // Системная ошибка — Processor закрыт
    default:
        // Неизвестная ошибка
    }
}

Тип ошибки

ValidationError

go
type ValidationError struct {
    Field   string
    Message string
    Err     error
}

Ошибка неудачной валидации на уровне поля. Подробности в разделе Типы и константы → ValidationError.