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

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

Модуль 3: Django
Рівень 18 , Лекція 3
Відкрита

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

Ви, звісно, пам'ятаєте, що токен — це унікальний рядок, який видається сервером користувачу після успішної аутентифікації. Цей токен відправляється клієнтом у наступних запитах (зазвичай у заголовку Authorization) для ідентифікації користувача. Токени — це наш "електронний перепусток" у світ захищених endpoint-ів 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.

Практика: створення захищеного endpoint

Давайте додамо захищений endpoint у наш проєкт. У файлі 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}! Це захищений endpoint."})

А в 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 соцмереж до інтеграції платіжних шлюзів. А токени (у їх різних формах) — це стандарт де-факто для сучасних екосистем. Тому використовуйте їх впевнено і з розумом!

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