JavaRush /Курсы /Модуль 3: Django /Установка и настройка TokenAuthentication

Установка и настройка TokenAuthentication

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

Метод TokenAuthentication позволяет идентифицировать пользователя через специально созданный токен, который передается в заголовках HTTP-запросов. Основное преимущество этого метода заключается в его простоте и гибкости. Токены используются в большинстве современных API, так что это хороший шаг вперед на вашем пути к мастерству. Ну и давайте честно, передавать логин/пароль в каждом запросе — это вчерашний день.

На этой лекции мы настроим аутентификацию с использованием токенов в нашем приложении. Мы:

  1. Установим пакет для работы с токенами.
  2. Настроим TokenAuthentication в проекте.
  3. Сгенерируем токены для пользователей.
  4. Научимся использовать токены в запросах для взаимодействия с API.

Установка необходимых пакетов

Для начала нам нужно установить пакет, который добавит поддержку токенов в наше приложение. DRF уже предоставляет встроенную поддержку токенов через пакет djangorestframework.

Если вы всё еще не установили DRF, сделайте это прямо сейчас:

pip install djangorestframework

Кроме того, для работы с токенами мы подключим приложение rest_framework.authtoken. Оно идёт в комплекте с DRF. Теперь нужно зарегистрировать его в INSTALLED_APPS.

Шаг 1: регистрация authtoken

Откройте файл settings.py вашего проекта и добавьте:

INSTALLED_APPS = [
    # Другие приложения
    'rest_framework',
    'rest_framework.authtoken',
]

После этого не забудьте применить миграции, чтобы создать таблицу для хранения токенов в базе данных:

python manage.py migrate

База данных готова, а приложение жаждет аутентифицировать ваших пользователей! Но подождите, у нас ещё куча дел впереди...

Настройка TokenAuthentication

Теперь нужно сообщить DRF, что мы будем использовать токен как метод аутентификации. Для этого мы добавим соответствующую настройку в settings.py.

Шаг 2: настройка аутентификации

Добавьте следующий код в файл settings.py:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

Здесь "DEFAULT_AUTHENTICATION_CLASSES" указывает DRF, что мы используем аутентификацию на основе токенов, а "DEFAULT_PERMISSION_CLASSES" говорит, что доступ к API будет предоставлен только аутентифицированным пользователям.

Создание токенов для пользователей

Для того чтобы пользователь мог аутентифицироваться в вашем API, ему нужен токен. Токены создаются для каждого пользователя и хранятся в базе данных. Удобно? Удобно. Вот как это сделать.

Шаг 3: автоматическая генерация токенов

DRF позволяет автоматически создавать токены для пользователей. Запустите команду:

python manage.py drf_create_token <username>

Например, если у вас есть пользователь с именем john, выполните:

python manage.py drf_create_token john

Вы увидите нечто вроде этого:

Generated token 123abc456def789ghi for user john

Вот и токен! Теперь вы можете использовать его для аутентификации.

4. Использование токенов в запросах

Теперь у нас есть токен, осталось научиться использовать его для взаимодействия с API. Токен передаётся в заголовке Authorization каждого запроса. Формат заголовка следующий:

Authorization: Token <ваш_токен>

Давайте проверим это на практике!

Шаг 4.1: Создание защищенного эндпоинта

Добавим защищённый маршрут в наш проект. Откройте файл views.py и создайте представление:

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated

class SecureEndpoint(APIView):
    permission_classes = [IsAuthenticated]

    def get(self, request):
        return Response({'message': 'Вы прошли проверку!'})

Теперь добавьте маршрут в urls.py:

from django.urls import path
from .views import SecureEndpoint

urlpatterns = [
    path('secure/', SecureEndpoint.as_view(), name='secure'),
]

Шаг 4.2: Тестирование с токеном

Попробуем отправить запрос к нашему защищённому маршруту. Откройте Postman (или используйте curl) и выполните GET-запрос:

GET /secure/ HTTP/1.1
Host: localhost:8000
Authorization: Token 123abc456def789ghi

Если токен действителен, вы получите следующий ответ:

{
    "message": "Вы прошли проверку!"
}

А если токен не указан или недействителен, вы получите ошибку 401 Unauthorized. Вот так ваш API теперь защищён.

Создание токенов программно (опционально)

Если вы хотите генерировать токены программно (например, при регистрации новых пользователей), вы можете сделать это с помощью модели Token, предоставляемой DRF.

Пример:

from rest_framework.authtoken.models import Token
from django.contrib.auth.models import User

# Получить пользователя (например, с id=1)
user = User.objects.get(id=1)

# Создать токен, если он ещё не существует
token, created = Token.objects.get_or_create(user=user)

print(token.key)  # Выводит токен пользователя

Эту логику можно интегрировать в процесс регистрации пользователя, чтобы токены автоматически создавались при добавлении новых пользователей.

О типичных ошибках

  1. Ошибка "AnonymousUser" в представлениях: если вы не указали TokenAuthentication в DEFAULT_AUTHENTICATION_CLASSES, DRF не сможет автоматически извлекать токен из заголовков. Перепроверьте настройки в settings.py.

  2. Дублирующиеся токены при миграции: иногда после повторных миграций база данных может содержать дублирующиеся токены. Убедитесь, что нет конфликтов миграций.

  3. Не работает токен: если клиент отправляет токен, но сервер отвечает "Unauthorized", проверьте заголовок Authorization — возможно, формат переданного токена некорректен.

Теперь ваше приложение готово к работе с токенами! Ну а в следующей лекции мы изучим JWT — более продвинутый подход к аутентификации. Не переключайтесь 😉.

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