Веб-додатки без аутентифікації — це як дім без дверей: будь-хто може зайти і поцупити ваш телевізор… або дані з бази. Токени дозволяють нам побудувати ці двері, надаючи ключ довіреним особам і залишаючи зловмисників зовні. Сьогодні ми розберемо процес генерації токенів, їх використання у запитах і, звісно, подивимося все це на практиці.
Ви, звісно, пам'ятаєте, що токен — це унікальний рядок, який видається сервером користувачу після успішної аутентифікації. Цей токен відправляється клієнтом у наступних запитах (зазвичай у заголовку 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'),
]
Тепер спробуйте:
- Надіслати запит без токена.
- Надіслати запит з токеном. Переконайтеся, що доступ можливий тільки з правильною автентифікацією.
Приклади використання токенів
- Мобільні додатки: клієнти можуть аутентифікуватися один раз, отримати токен і використовувати його для доступу до даних, наприклад, у додатку для iOS або Android.
- Інтеграція з зовнішніми системами: токени — зручний спосіб надання обмеженого доступу іншим сервісам (наприклад, платіжним системам для перевірки даних).
- Веб-клієнти (SPA): односторінкові додатки можуть зберігати токен після логіна і використовувати його для взаємодії з сервером.
Помилки і хитрощі
Якщо ви отримали помилку 401 Unauthorized, ймовірно, проблема в одному з наступних випадків:
- У запиті відсутній заголовок
Authorization, або він заданий некоректно. - Токен користувача був видалений з бази даних.
- Ви забули включити
TokenAuthenticationуsettings.py.
Для відладки завжди можна перевірити токени в адмінці: якщо токен у користувача відсутній, його можна згенерувати вручну.
Все, що ми дізналися сьогодні, вже активно використовується в реальних проєктах: від авторизації в API соцмереж до інтеграції платіжних шлюзів. А токени (у їх різних формах) — це стандарт де-факто для сучасних екосистем. Тому використовуйте їх впевнено і з розумом!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ