INTERNAL AUTH FIX

This commit is contained in:
2025-05-21 18:29:32 +03:00
parent f6156ccfa3
commit ebf9dfcf62
6 changed files with 263 additions and 53 deletions

View File

@@ -101,6 +101,48 @@
- Время блокировки: 30 минут
- Сброс счетчика после успешного входа
## Обработка заголовков авторизации
### Особенности работы с заголовками в Starlette
При работе с заголовками в Starlette/FastAPI необходимо учитывать следующие особенности:
1. **Регистр заголовков**: Заголовки в объекте `Request` чувствительны к регистру. Для надежного получения заголовка `Authorization` следует использовать регистронезависимый поиск.
2. **Формат Bearer токена**: Токен может приходить как с префиксом `Bearer `, так и без него. Необходимо обрабатывать оба варианта.
### Правильное получение заголовка авторизации
```python
# Получение заголовка с учетом регистра
headers_dict = dict(req.headers.items())
token = None
# Ищем заголовок независимо от регистра
for header_name, header_value in headers_dict.items():
if header_name.lower() == SESSION_TOKEN_HEADER.lower():
token = header_value
break
# Обработка Bearer префикса
if token and token.startswith("Bearer "):
token = token.split("Bearer ")[1].strip()
```
### Распространенные проблемы и их решения
1. **Проблема**: Заголовок не находится при прямом обращении `req.headers.get("Authorization")`
**Решение**: Использовать регистронезависимый поиск по всем заголовкам
2. **Проблема**: Токен приходит с префиксом "Bearer" в одних запросах и без него в других
**Решение**: Всегда проверять и обрабатывать оба варианта
3. **Проблема**: Токен декодируется, но сессия не находится в Redis
**Решение**: Проверить формирование ключа сессии и добавить автоматическое создание сессии для валидных токенов
4. **Проблема**: Ошибки при декодировании JWT вызывают исключения
**Решение**: Обернуть декодирование в try-except и возвращать None вместо вызова исключений
## Конфигурация
Основные настройки в settings.py: