Полное руководство по авторизации в Django REST Framework: или как не пустить хакеров на свою кухню

Django REST Framework (DRF) — это мощный и гибкий инструментарий с открытым исходным кодом для создания веб-API (Application Programming Interfaces) на базе Django
Django REST Framework (DRF) — это мощный и гибкий инструментарий с открытым исходным кодом для создания веб-API (Application Programming Interfaces) на базе Django

Привет, читатель! 👋 Представь, что ты построил шикарный цифровой особняк — свое API. Мебель расставлена (эндпоинты), интерьер продуман (логика), но... двери нет. Любой прохожий может зайти, попить твой кофе и устроить хаос. Звучит не очень? Вот именно для этого нам и нужна система аутентификации и авторизации. А в мире Django REST Framework (DRF) для этого есть целый арсенал инструментов. Давай разберем их все, от простого ключа до сложных токенов.

🧩 Зачем все это? Или коротко о главном

DRF — это мощный инструмент для создания веб-API на Django, созданный Томом Кристи. Его философия — дать разработчикам гибкость и скорость, не жертвуя безопасностью. Без надежной аутентификации твое API — как банк с открытой дверью. В лучшем случае, кто-то будет читать не свои данные, в худшем — удалит всю базу. Страшно? Не должно быть, ведь у нас есть проверенные инструменты.

Основатели и философия: DRF появился в 2011 году как ответ на растущую потребность в RESTful API для Django. Его создатель, Том Кристи, сделал ставку на декларативность, расширяемость и совместимость с экосистемой Django. Миссия — дать разработчикам набор инструментов, который делает сложные вещи простыми, а простые — элегантными.

Полное руководство по авторизации в Django REST Framework: или как не пустить хакеров на свою кухню

⚙ Базовый уровень: SessionAuthentication — старый добрый способ

Помнишь, как авторизуешься на обычном сайте Django? Вводишь логин-пароль, сервер создает сессию, и браузер хранит sessionid в куках. SessionAuthentication в DRF работает точно так же.

python REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', ] }

Это простой и надежный способ для SPA (Single Page Applications), которые живут на том же домене, что и API. Как это работает под капотом? DRF использует стандартный механизм сессий Django, который хранит данные либо в базе (django.contrib.sessions.models.Session), либо в кэше. Запрос считается аутентифицированным, если в его заголовках есть корректный sessionid из куки.

Плюсы: Не нужно ничего изобретать, работает из коробки, безопасно (сессии можно настроить на https-only). Минусы: Неудобно для мобильных приложений или микросервисов, где нет единого домена и браузерных кук. И да, подвержен CSRF-атакам, если не использовать защиту (но DRF и Django о ней позаботятся, если все настроить правильно).

📏 Для мобильников и микросервисов: TokenAuthentication

Вот мы и подошли к классике жанра. TokenAuthentication — это как пропускная карточка в офис. Пользователь один раз предъявляет паспорт (логин/пароль), получает пластиковую карточку (токен) и потом просто прикладывает ее к турникету отправляет в заголовках запроса.

python REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', ] }

Не забудь добавить 'rest_framework.authtoken' в INSTALLED_APPS и сделать миграции. Пользователю токен можно выдать через админку, сигнал post_save или специальный эндпоинт.

А теперь самое интересное: как это работает? При успешной проверке логина и пароля DRF генерирует случайный 40-символьный ключ (хеш), сохраняет его в базе в модели Token, связанную с пользователем. Клиент должен включать этот токен в заголовок запроса:

text Authorization: Token 9944b09199c62bcf9418ad846dd0e4bbdfc6ee4b

Пример Токена :

Сервер находит токен в базе, определяет пользователя и вуаля доступ открыт.

Но есть нюанс: токен бессрочный. Потерял токен? Злоумышленник получит доступ навсегда. Именно поэтому появились...

✨ Звезда современного шоу: JSON Web Tokens (JWT) с помощью djangorestframework-simplejwt

JWT — это не просто токен, это целый паспорт со встроенными данными. В отличие от простого токена, который просто ключ от базы, JWT сам содержит информацию о пользователе и правах. Это самодостаточный артефакт.

Зачем это нужно? Масштабируемость. Серверу не нужно лезть в базу при каждом запросе для проверки токена — вся необходимая информация уже внутри JWT. Проверяется только подпись. Идеально для распределенных систем.

Главный боец на ринге: djangorestframework-simplejwt — самый популярный пакет для JWT в DRF. Установи его (pip install djangorestframework-simplejwt) и настрой:

python REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ) }

Добавь в urls.py маршруты для получения и обновления токенов:

python REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework_simplejwt.authentication.JWTAuthentication', ) } Добавь в urls.py маршруты для получения и обновления токенов: python from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView urlpatterns = [ ... path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), ]
  • 🔬Как это устроено под капотом?
  1. Пользователь шлет логин/пароль на /api/token/.
  2. Сервер проверяет их и генерирует два токена: Access и Refresh. Access Token — короткоживущий (например, 5 минут). Он содержит в себе закодированные (payload) данные пользователя (user_id, username) и используется для доступа к защищенным эндпоинтам. Передается в заголовке Authorization: Bearer <токен>. Refresh Token — долгоживущий (несколько дней). Он не содержит payload, а служит только для получения новой пары токенов, когда access истек.
  3. Клиент использует access token. Когда он протухает, клиент не заставляет пользователя снова логиниться, а отправляет refresh token на /api/token/refresh/ и получает новую пару.

Разве это не чудо? Безопасность и короткая жизнь access-токена + удобство (не нужно логиниться каждые 5 минут)

Аналитика и позиция: JWT стал де-факто стандартом для современных API. SimpleJWT — это легковесная, гибкая и хорошо документированная библиотека, которая идеально вписывается в философию DRF. Партнерства и клиенты? Фактически, весь мир, который строит SPA и мобильные приложения на Django. Архитектура JWT отлично ложится на микросервисы и serverless-функции.

Полное руководство по авторизации в Django REST Framework: или как не пустить хакеров на свою кухню

🧭 Для продвинутых: OAuth2 и сторонние провайдеры (drf-social-oauth2)

А если ты хочешь позволить пользователям заходить через «Войти через Google/Facebook/GitHub»? Добро пожаловать в мир OAuth 2.0. Это уже не просто аутентификация, а целый протокол делегирования доступа.

Представь: твое приложение (клиент) просит у пользователя разрешение получить его данные из Google (ресурсный сервер). Пользователь соглашается у Google, а Google выдает тебе специальный ключ-разрешение (access token), с которым ты можешь спросить у Google: «Эй, дай-ка email и имя этого пользователя».

Для интеграции этого в DRF есть отличный пакет drf-social-oauth2.

bash pip install drf-social-oauth2

Настройка требует добавления бэкендов аутентификации и указания ключей, полученных от провайдеров (Google, FB и т.д.).

Зачем это нужно? Удобство для пользователя (не нужно запоминать еще один пароль) и доверие (они верят Google больше, чем новому сайту). Это must-have для большинства consumer-приложений.

✍ Кастомная аутентификация: когда нужно что-то особенное

А что, если у тебя свой протокол? Скажем, проверка по заголовку X-API-Key от внутреннего сервиса? Легко! DRF позволяет написать свой класс аутентификации. Наследуйся от BaseAuthentication и переопредели метод .authenticate(self, request).

python from rest_framework.authentication import BaseAuthentication from rest_framework.exceptions import AuthenticationFailed from myapp.models import ApiKey class ApiKeyAuthentication(BaseAuthentication): def authenticate(self, request): api_key = request.headers.get('X-API-Key') if not api_key: return None try: key_obj = ApiKey.objects.get(key=api_key, is_active=True) except ApiKey.DoesNotExist: raise AuthenticationFailed('Invalid API key') return (key_obj.user, None) # (user, auth)

И добавь свой класс в DEFAULT_AUTHENTICATION_CLASSES. Гибкость DRF на высоте!

✅ Что выбирать? Итоговая таблица-шпаргалка

Полное руководство по авторизации в Django REST Framework: или как не пустить хакеров на свою кухню

✍ Финал, но не конец

Авторизация в DRF — это не страшно. Это как выбрать правильный замок для своей двери. Для дачи хватит и навесного (Session), для квартиры — хорошей цилиндровки (Token), а для банковской ячейки нужна многофакторная система с биометрией (JWT + OAuth2).

Главное — понять, кто твои пользователи (браузеры, мобильные приложения, другие сервисы) и в каком окружении работает API. И тогда выбор станет очевидным.

📚 Документация, с которой стоит жить:

🙌 Ну что, разобрались? Если статья была полезной и спасла тебя от пары часов чтения скучной документации — буду рад! Подписывайся, дальше разберем, как выстроить железобетонные permissions (права доступа) в DRF, чтобы не только пускать в дом, но и решать, кому можно в гостиную, а кому — только в прихожую.

Пиши в комментариях, с какими схемами аутентификации ты чаще всего сталкивался и какие финты пришлось выдумывать самому. Обмен опытом — это сила! Удачи в коде

1
1 комментарий