INTERNAL AUTH FIX
This commit is contained in:
42
docs/auth.md
42
docs/auth.md
@@ -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:
|
||||
|
Reference in New Issue
Block a user