📖 Теория: аутентификация и разрешения в 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=
Безопасность: BasicAuthentication передаёт учётные данные в каждом запросе. Используйте только с HTTPS. В открытых сетях заголовок легко перехватить — Base64 декодируется тривиально.

Настройка в settings.py — либо глобально, либо напрямую в классе представления через атрибут authentication_classes.

2. TokenAuthentication

DRF хранит токены в базе данных (модель Token из пакета rest_framework.authtoken). Каждому пользователю выдаётся один статический токен.

Процесс получения токена:

  1. Клиент отправляет POST-запрос на /api-token-auth/ с username и password
  2. DRF возвращает JSON с полем token
  3. Клиент сохраняет токен и использует его в последующих запросах
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, переопределяет глобальные настройки

Поуровневая настройка всегда приоритетнее глобальной.

← К оглавлению урока    Справочник →