Какие коды ошибок свойственны проблемам с авторизацией
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Основные коды ошибок при проблемах с авторизацией
В мобильной разработке, особенно для Android, проблемы с авторизацией возникают на разных уровнях — от сетевых запросов до локальной валидации токенов. Вот основные коды ошибок и их обработка.
HTTP статус-коды (уровень API)
Серверная часть чаще всего использует стандартные HTTP-статусы для индикации проблем аутентификации и авторизации:
- 401 Unauthorized — классическая ошибка аутентификации. Сервер не узнал пользователя (например, неверные или отсутствующие учетные данные, истекший токен). Обычно требует повторного входа.
when (response.code()) {
401 -> handleUnauthorized() // Требует повторной аутентификации
}
-
403 Forbidden — ошибка авторизации. Пользователь аутентифицирован, но не имеет прав на запрашиваемый ресурс/действие. В этом случае повторный логин не поможет, нужно запросить дополнительные разрешения.
-
400 Bad Request — может возвращаться при некорректном формате запроса (например, неверный формат email/пароля при логине). Часто в теле ответа содержится детальное описание ошибки.
Кастомные коды в теле ответа
Многие API возвращают 200/400 HTTP-статус, но с детализированными кодами в JSON-теле:
{
"error": {
"code": "INVALID_CREDENTIALS",
"message": "Неверный email или пароль"
}
}
Распространенные кастомные коды:
- INVALID_TOKEN / TOKEN_EXPIRED — проблемы с JWT или OAuth токеном
- USER_NOT_FOUND / ACCOUNT_DISABLED — проблемы с учетной записью
- INSUFFICIENT_PERMISSIONS — частный случай Forbidden
- RATE_LIMIT_EXCEEDED — превышены попытки ввода пароля
Локальные коды ошибок (на стороне Android)
До отправки запроса на сервер приложение должно выполнять локальную валидацию:
sealed class AuthError : Exception() {
object NetworkError : AuthError()
object InvalidEmailFormat : AuthError()
object PasswordTooShort : AuthError()
object BiometricNotAvailable : AuthError()
object TokenStorageError : AuthError()
data class ServerError(val code: String, val message: String) : AuthError()
}
OAuth-специфичные ошибки
При работе с OAuth 2.0 / OpenID Connect могут возникать специфичные ошибки:
- invalid_grant — неверный, просроченный или отозванный код авторизации
- invalid_client — проблемы с client_id или client_secret
- unsupported_grant_type — сервер не поддерживает такой тип запроса
- invalid_scope — запрошен неверный или неподдерживаемый scope
Практические рекомендации по обработке
- Единая точка обработки ошибок — создайте
AuthErrorHandlerили интерцептор в Retrofit/OkHttp - Разделение аутентификации и авторизации — 401 требует повторного логина, 403 — показа пользователю, что доступ запрещен
- Автоматическое обновление токенов — при 401 ошибке попробуйте обновить access token с помощью refresh token
- Логирование и аналитика — отслеживайте частые ошибки авторизации для улучшения UX
- Грейсфул деградация — при постоянных ошибках auth предложите войти в офлайн-режиме (если возможно)
class AuthInterceptor(private val tokenManager: TokenManager) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val response = chain.proceed(chain.request())
when (response.code) {
401 -> {
// Пытаемся обновить токен
val newToken = tokenManager.refreshToken()
if (newToken != null) {
// Повторяем запрос с новым токеном
return chain.proceed(
chain.request().newBuilder()
.header("Authorization", "Bearer $newToken")
.build()
)
} else {
// Требуем повторного входа
throw AuthException.Unauthorized()
}
}
403 -> throw AuthException.Forbidden()
}
return response
}
}
Корректная обработка этих ошибок критична для безопасности и пользовательского опыта. Всегда предоставляйте понятные сообщения об ошибках и четкие пути их решения (восстановление пароля, повторный вход, обращение в поддержку).