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.
- Сделайте POST-запрос на
api/token/
, передав имя пользователя и пароль в теле запроса:jsonКопировать код{ "username": "example_user", "password": "example_password" }
- В ответе вы получите токен в следующем формате: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 настройка занимает всего несколько минут, а результатом становится гибкая и масштабируемая система аутентификации.