Skip to content

Обработка ошибок

CyberGo JWT использует паттерн сигнальных ошибок (sentinel errors). Все ошибки проверяются через errors.Is().

Базовый шаблон

go
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.ErrTokenInvalidIssuer):
        // Издатель не совпадает
    case errors.Is(err, jwt.ErrTokenInvalidAudience):
        // Аудитория не совпадает
    case errors.Is(err, jwt.ErrInvalidToken):
        // Подпись недействительна или формат ошибочен
    case errors.Is(err, jwt.ErrProcessorClosed):
        // Processor закрыт
    default:
        // Другие ошибки
    }
}

Используйте errors.Is()

Не используйте err == jwt.ErrTokenExpired или сопоставление строк. errors.Is() корректно обрабатывает обёрнутые ошибки.

Классификация ошибок

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

jwt.New() может возвращать следующие ошибки:

ОшибкаПричинаРешение
ErrInvalidConfigНесколько недопустимых параметровПроверьте все поля Config
ErrInvalidSecretKeyHMAC-ключ менее 32 байт или слабый ключИспользуйте более надёжный ключ
ErrInvalidSigningMethodНеподдерживаемый алгоритм подписиИспользуйте один из 12 встроенных алгоритмов

Операции с токенами

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

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

ОшибкаМетодыРекомендации по обработке
ErrRateLimitExceededCreate, CreateRefresh, Refresh, RefreshIntoВернуть 429
ErrBlacklistNotConfiguredRevokeНастройте чёрный список

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

ОшибкаМетодыРекомендации по обработке
ErrProcessorClosedВсе методыСоздайте Processor заново
ErrStoreClosedRevoke и другиеХранилище закрыто

Тип ошибки

ValidationError

Возвращается при неудачной валидации на уровне поля, содержит конкретное поле и информацию об ошибке:

go
type ValidationError struct {
    Field   string  // Имя поля с ошибкой
    Message string  // Описание ошибки
    Err     error   // Внутренняя ошибка
}

Обработка ошибок в веб-сервисе

go
func handleProtected(w http.ResponseWriter, r *http.Request) {
    tokenString := extractToken(r)
    claims, valid, err := processor.Validate(tokenString)
    if err != nil {
        switch {
        case errors.Is(err, jwt.ErrTokenExpired):
            http.Error(w, "token expired", http.StatusUnauthorized)
        case errors.Is(err, jwt.ErrTokenRevoked):
            http.Error(w, "token revoked", http.StatusUnauthorized)
        case errors.Is(err, jwt.ErrInvalidToken):
            http.Error(w, "invalid token", http.StatusUnauthorized)
        default:
            http.Error(w, "auth failed", http.StatusUnauthorized)
        }
        return
    }
    if !valid {
        http.Error(w, "invalid token", http.StatusUnauthorized)
        return
    }
    // Обработка запроса
}

Дальнейшие шаги