📖 Теория: аутентификация и разрешения в DRF
⚡ Три метода + два permission-класса
- BasicAuthentication: логин:пароль → Base64 → заголовок
Basic ... - TokenAuthentication: POST /api-token-auth/ → получить токен → заголовок
Token ... - JWTAuthentication: POST /api/token/ → access + refresh → заголовок
Bearer ... - IsAuthenticatedOrReadOnly: GET без токена — ОК; POST/PUT/DELETE — нужна аутентификация
- IsAdminUser: только пользователи с
is_staff=True
Три механизма аутентификации
1. BasicAuthentication
Самый простой механизм. Клиент кодирует строку username:password в Base64 и передаёт её в каждом запросе через заголовок:
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Настройка в settings.py — либо глобально, либо напрямую в классе представления через атрибут authentication_classes.
2. TokenAuthentication
DRF хранит токены в базе данных (модель Token из пакета rest_framework.authtoken). Каждому пользователю выдаётся один статический токен.
Процесс получения токена:
- Клиент отправляет POST-запрос на
/api-token-auth/сusernameиpassword - DRF возвращает JSON с полем
token - Клиент сохраняет токен и использует его в последующих запросах
Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b
authtoken_token. Без python manage.py migrate после добавления rest_framework.authtoken в INSTALLED_APPS — ошибка при первом запросе.
3. JWTAuthentication (SimpleJWT)
JSON Web Token — самодостаточный токен, хранящий payload прямо в себе. Не требует обращения к базе при проверке (для access-токена).
Два типа токенов:
- access token — короткоживущий (по умолчанию 5 минут), используется для запросов
- refresh token — долгоживущий (по умолчанию 1 день), используется для обновления access
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Маршруты SimpleJWT:
POST /api/token/— получить access + refresh токеныPOST /api/token/refresh/— обновить access токен по refresh
Классы разрешений (Permissions)
IsAuthenticated
Доступ только аутентифицированным пользователям. Если пользователь не аутентифицирован — 401 (нет токена) или 403 (токен есть, но неверный).
IsAuthenticatedOrReadOnly
GET/HEAD/OPTIONS — доступны всем (в том числе анонимам). POST/PUT/PATCH/DELETE — только аутентифицированным. Удобно для API, где чтение публичное, а запись требует входа.
IsAdminUser
Доступ только пользователям с флагом is_staff=True. Обычно это суперпользователи и пользователи, созданные через Django admin с флагом «Персонал».
AllowAny
Доступ всем без исключения, включая анонимных пользователей. Используется для публичных эндпоинтов (регистрация, получение токена).
Глобальная vs поуровневая настройка
DRF поддерживает два уровня настройки:
- Глобально — через
REST_FRAMEWORKвsettings.py, применяется ко всем представлениям - На уровне представления — через атрибуты
authentication_classesиpermission_classesв классе View, переопределяет глобальные настройки
Поуровневая настройка всегда приоритетнее глобальной.