Веб-приложения без аутентификации — это как дом без двери: любой прохожий может зайти и утащить ваш телевизор… или данные из базы. Токены позволяют нам выстроить эту дверь, предоставляя ключ доверенным лицам и сохраняя злоумышленников снаружи. Сегодня мы разберём процесс генерации токенов, их использования в запросах и, конечно, посмотрим всё это на практике.
Вы, конечно же, помните, что токен — это уникальная строка, которая выдается сервером пользователю после успешной аутентификации. Этот токен отправляется клиентом в последующих запросах (обычно в заголовке Authorization) для идентификации пользователя. Токены — это наша "электронная пропускашка" в мир защищённых эндпоинтов API.
Создание токенов для пользователей
Для работы с токенами в DRF используется встроенное приложение rest_framework.authtoken. Оно специально разработано для упрощения работы с токенами. Давайте вспомним установку из прошлой лекции, а затем перейдём к практической части.
Шаг 1. Убедитесь, что TokenAuthentication активен
В settings.py вашего проекта аутентификация должна быть настроена таким образом:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
],
}
Это говорит DRF, что каждый запрос будет проверяться на наличие токенов в заголовках.
Шаг 2. Подключение и создание токенов
Сначала будем использовать административный интерфейс Django для генерации токенов. Для этого зарегистрируйте модель токенов в admin.py вашего основного приложения:
from django.contrib import admin
from rest_framework.authtoken.models import Token
admin.site.register(Token)
Теперь в админке вы увидите раздел Tokens, где можно создавать токены вручную для пользователей. Хотя это полезно для тестирования, автоматическое создание токенов — более популярный и практичный подход. Далее мы это реализуем.
Шаг 3. Генерация токенов при создании пользователя
Чтобы токен автоматически создавался для пользователя при его регистрации, мы можем использовать Django Signals. Добавьте следующий код в signals.py вашего приложения:
from django.conf import settings
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
И не забудьте подключить этот файл сигналов в apps.py вашего приложения:
def ready(self):
import your_app_name.signals # Замените `your_app_name` на имя вашего приложения
Теперь каждый раз, когда создаётся новый пользователь, ему будет автоматически выдаваться уникальный токен.
Использование токенов в запросах
Теперь, когда токены создаются и управляются автоматически, давайте научимся их использовать в запросах.
DRF предоставляет нам удобный эндпоинт для получения токена. Все, что нужно, — это добавить его в urls.py:
from django.urls import path
from rest_framework.authtoken.views import obtain_auth_token
urlpatterns = [
path('api/token/', obtain_auth_token, name='api_token_auth'),
]
Теперь клиент может отправить POST-запрос на /api/token/, отправив имя пользователя и пароль:
POST /api/token/
Content-Type: application/json
{
"username": "your_username",
"password": "your_password"
}
Если данные аутентификации корректны, сервер вернёт токен:
{
"token": "d8b45c3481df4d558c4a3bfd7326b9fbfcb34475"
}
Для отправки запросов к защищённым API клиент должен включать токен в заголовок HTTP. Формат заголовка следующий:
Authorization: Token <ваш_токен>
Пример запроса с токеном с использованием curl:
curl -X GET http://127.0.0.1:8000/api/protected-endpoint/ \
-H "Authorization: Token d8b45c3481df4d558c4a3bfd7326b9fbfcb34475"
В DRF представления автоматически проверяют этот заголовок и аутентифицируют пользователя. Если токен недействителен или отсутствует, ответ будет статусом 401 Unauthorized.
Практика: создание защищённого эндпоинта
Давайте добавим защищённый эндпоинт в наш проект. В файле views.py создадим простой пример:
from rest_framework.decorators import api_view, permission_classes
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def protected_view(request):
return Response({"message": f"Привет, {request.user.username}! Это защищённый эндпоинт."})
А в urls.py добавьте маршрут:
from django.urls import path
from .views import protected_view
urlpatterns = [
path('api/protected-endpoint/', protected_view, name='protected_endpoint'),
]
Теперь попробуйте:
- Отправить запрос без токена.
- Отправить запрос с токеном. Убедитесь, что доступ возможен только с правильной аутентификацией.
Примеры использования токенов
- Мобильные приложения: клиенты могут аутентифицироваться один раз, получить токен и использовать его для доступа к данным, например, в приложении для iOS или Android.
- Интеграция с внешними системами: токены — удобный способ предоставления ограниченного доступа другим сервисам (например, платёжным системам для проверки данных).
- Веб-клиенты (SPA): одностраничные приложения могут хранить токен после логина и использовать его для общения с сервером.
Ошибки и хитрости
Если вы получили ошибку 401 Unauthorized, вероятно, проблема в одном из следующих случаев:
- В запросе отсутствует заголовок
Authorization, либо он задан некорректно. - Токен пользователя был удалён из базы данных.
- Вы забыли включить
TokenAuthenticationвsettings.py.
Для отладки всегда можно проверить токены в админке: если токен у пользователя отсутствует, его можно сгенерировать вручную.
Всё, что мы узнали сегодня, уже активно используется в реальных проектах: от авторизации в API соцсетей до интеграции платёжных шлюзов. А токены (в их различных формах) — это стандарт де-факто для современных экосистем. Поэтому используйте их уверенно и с умом!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ