JavaRush /Курсы /Модуль 3: Django /Создание и использование токенов для доступа к API

Создание и использование токенов для доступа к API

Модуль 3: Django
18 уровень , 3 лекция
Открыта

Веб-приложения без аутентификации — это как дом без двери: любой прохожий может зайти и утащить ваш телевизор… или данные из базы. Токены позволяют нам выстроить эту дверь, предоставляя ключ доверенным лицам и сохраняя злоумышленников снаружи. Сегодня мы разберём процесс генерации токенов, их использования в запросах и, конечно, посмотрим всё это на практике.

Вы, конечно же, помните, что токен — это уникальная строка, которая выдается сервером пользователю после успешной аутентификации. Этот токен отправляется клиентом в последующих запросах (обычно в заголовке 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'),
]

Теперь попробуйте:

  1. Отправить запрос без токена.
  2. Отправить запрос с токеном. Убедитесь, что доступ возможен только с правильной аутентификацией.

Примеры использования токенов

  1. Мобильные приложения: клиенты могут аутентифицироваться один раз, получить токен и использовать его для доступа к данным, например, в приложении для iOS или Android.
  2. Интеграция с внешними системами: токены — удобный способ предоставления ограниченного доступа другим сервисам (например, платёжным системам для проверки данных).
  3. Веб-клиенты (SPA): одностраничные приложения могут хранить токен после логина и использовать его для общения с сервером.

Ошибки и хитрости

Если вы получили ошибку 401 Unauthorized, вероятно, проблема в одном из следующих случаев:

  • В запросе отсутствует заголовок Authorization, либо он задан некорректно.
  • Токен пользователя был удалён из базы данных.
  • Вы забыли включить TokenAuthentication в settings.py.

Для отладки всегда можно проверить токены в админке: если токен у пользователя отсутствует, его можно сгенерировать вручную.

Всё, что мы узнали сегодня, уже активно используется в реальных проектах: от авторизации в API соцсетей до интеграции платёжных шлюзов. А токены (в их различных формах) — это стандарт де-факто для современных экосистем. Поэтому используйте их уверенно и с умом!

1
Задача
Модуль 3: Django, 18 уровень, 3 лекция
Недоступна
Установка и настройка токен-аутентификации
Установка и настройка токен-аутентификации
1
Задача
Модуль 3: Django, 18 уровень, 3 лекция
Недоступна
Создание защищенного API Endpoint
Создание защищенного API Endpoint
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ