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 — більш просунутий підхід до аутентифікації. Не перемикайтеся 😉.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ