Авторизация с использованием JWT в DjangoАвторизация с использованием JWT в Django

JWT (JSON Web Token) — это современный способ авторизации, который широко используется в веб-приложениях. Он позволяет передавать данные между клиентом и сервером в безопасном формате, используя токены. В этой статье мы рассмотрим, как настроить авторизацию на основе JWT в Django.

Что такое JWT?

JWT представляет собой строку, состоящую из трех частей: заголовка, полезной нагрузки и подписи. Эти части кодируются в формате Base64 и объединяются через точки (.).

  • Заголовок (Header) содержит тип токена (обычно JWT) и алгоритм шифрования (например, HS256).
  • Полезная нагрузка (Payload) хранит данные, такие как идентификатор пользователя или время истечения токена.
  • Подпись (Signature) создаётся на основе заголовка, полезной нагрузки и секретного ключа. Она обеспечивает защиту от изменения данных токена.

JWT токен отправляется клиенту после успешной аутентификации и затем используется для подтверждения личности пользователя при запросах к защищённым ресурсам.

Установка библиотек

Для работы с JWT в Django мы будем использовать библиотеку djangorestframework-simplejwt, которая упрощает настройку JWT. Установите её с помощью pip:

pip install djangorestframework-simplejwt

Настройка Django

Для начала нужно убедиться, что у вас установлен и настроен Django REST Framework. В файле settings.py добавьте 'rest_framework' в список установленных приложений:

INSTALLED_APPS = [
...
'rest_framework',
]

Теперь настроим REST Framework для использования Simple JWT. В том же settings.py добавьте следующую конфигурацию:

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
),
}

Эта настройка сообщает Django, что для обработки аутентификации следует использовать JWT.

Генерация токена

Чтобы выдать пользователю токен после аутентификации, Simple JWT предоставляет готовые представления (views), которые можно подключить в проект. Добавьте следующие пути в ваш файл urls.py:

from django.urls import path
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)

urlpatterns = [
...
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]

Эти пути позволяют клиенту получить токен (api/token/) и обновить его при истечении срока действия (api/token/refresh/).

Тестирование выдачи токена

Для проверки работы токена можно использовать инструменты, такие как Postman или встроенный браузер API в Django REST Framework.

  1. Сделайте POST-запрос на api/token/, передав имя пользователя и пароль в теле запроса:jsonКопировать код{ "username": "example_user", "password": "example_password" }
  2. В ответе вы получите токен в следующем формате:jsonКопировать код{ "access": "your_access_token", "refresh": "your_refresh_token" } access — основной токен, который используется для авторизации. refresh позволяет получить новый access-токен, не требуя повторного ввода логина и пароля.

Защита ресурсов с использованием токена

Теперь мы можем защищать определённые API-эндпоинты, требуя, чтобы клиент предоставил токен. В представлении (view) используем декоратор @permission_classes для ограничения доступа.

Пример защищённого эндпоинта:

from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def protected_view(request):
return Response({"message": "Это защищённый ресурс, доступный только для авторизованных пользователей!"})

Когда пользователь делает запрос к этому эндпоинту, он должен включить токен в заголовок авторизации:

Authorization: Bearer your_access_token

Если токен отсутствует или недействителен, сервер вернёт ошибку 401 (Unauthorized).

Обновление токена

JWT токены обычно имеют ограниченный срок действия (например, 5 минут). Для получения нового токена клиент может использовать эндпоинт api/token/refresh/. Клиент отправляет запрос с refresh-токеном, чтобы получить новый access-токен:

{
"refresh": "your_refresh_token"
}

Ответ сервера:

{
"access": "new_access_token"
}

Настройка сроков действия токена

Вы можете настроить время действия access и refresh токенов в settings.py:

from datetime import timedelta

SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
}

Здесь ACCESS_TOKEN_LIFETIME задаёт время жизни основного токена, а REFRESH_TOKEN_LIFETIME — время действия токена для обновления.

Заключение

Использование JWT для авторизации в Django REST Framework обеспечивает безопасный и современный способ управления доступом к ресурсам. С помощью библиотеки Simple JWT настройка занимает всего несколько минут, а результатом становится гибкая и масштабируемая система аутентификации.

Поделится