JWT (JSON Web Token) – это современный и безопасный способ реализации аутентификации и авторизации в веб-приложениях и API. В контексте Django Rest Framework (DRF), JWT предоставляет гибкий механизм для защиты ваших API-эндпоинтов. Вместо традиционных сессий или токенов, JWT использует криптографически подписанные токены, которые передаются между клиентом и сервером. Это позволяет создавать масштабируемые и stateless API.
В этом туториале мы рассмотрим, как настроить и использовать JWT аутентификацию в Django Rest Framework, включая установку необходимой библиотеки, создание эндпоинтов для получения токенов, защиту представлений API и реализацию refresh-токенов.
Установка и настройка Simple JWT
Simple JWT – это популярная библиотека Django, упрощающая работу с JWT. Она предоставляет удобные инструменты для создания, проверки и обновления JWT токенов.
Установка Simple JWT и базовые настройки
- Установите Simple JWT с помощью pip:
pip install djangorestframework-simplejwt
- Добавьте
rest_framework_simplejwtвINSTALLED_APPSв вашемsettings.pyфайле:
INSTALLED_APPS = [
...
'rest_framework_simplejwt',
]
- Настройте
REST_FRAMEWORKвsettings.py, указавJWTAuthenticationв качестве схемы аутентификации по умолчанию:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
}
-
(Опционально) Настройте параметры JWT, такие как время жизни токена, алгоритм подписи и т.д. Это можно сделать, добавив секцию
SIMPLE_JWTв вашsettings.pyфайл. Например:SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), 'ROTATE_REFRESH_TOKENS': False, 'BLACKLIST_AFTER_ROTATION': True, }
Настройка приложений Django для работы с JWT
Убедитесь, что у вас установлены и настроены Django Rest Framework и Django. Simple JWT интегрируется с DRF для обеспечения аутентификации и авторизации.
Создание и использование JWT токенов
Создание access и refresh токенов
Simple JWT предоставляет готовые view для создания токенов. Вам потребуется только добавить их в ваши URL patterns.
Реализация эндпоинтов для получения токенов (login/token)
- В вашем
urls.pyфайле, добавьте пути кTokenObtainPairViewиTokenRefreshView:
from django.urls import path
from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)
urlpatterns = [
path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
]
-
TokenObtainPairViewпринимает username и password и возвращает access и refresh токены. -
TokenRefreshViewпринимает refresh токен и возвращает новый access токен.
- Чтобы получить токены, отправьте POST-запрос на эндпоининт
/token/с данными пользователя (username и password):
{
"username": "your_username",
"password": "your_password"
}
В ответе вы получите JSON с access и refresh токенами:
{
"access": "...access_token...",
"refresh": "...refresh_token..."
}
Реализация аутентификации и авторизации с JWT
Использование JWT для аутентификации в DRF
После настройки DEFAULT_AUTHENTICATION_CLASSES, DRF автоматически будет использовать JWT для аутентификации запросов. Если токен присутствует в заголовке Authorization, DRF проверит его валидность.
Защита эндпоинтов с помощью JWT и permissions
Для защиты определенных эндпоинтов, добавьте permission_classes к вашему view:
from rest_framework import permissions
from rest_framework.views import APIView
from rest_framework.response import Response
class MyProtectedView(APIView):
permission_classes = [permissions.IsAuthenticated]
def get(self, request):
return Response({'message': 'This view is protected!'})
В этом примере MyProtectedView доступен только аутентифицированным пользователям. Пользователь должен предоставить валидный JWT токен в заголовке Authorization. Заголовок должен иметь формат Authorization: Bearer <token>.
Продвинутые техники работы с JWT
Реализация refresh токенов для обновления access токенов
Refresh токены позволяют обновлять access токены без необходимости повторной аутентификации пользователя. Simple JWT предоставляет готовую view TokenRefreshView для этого. Отправьте refresh токен на эндпоинт /token/refresh/, чтобы получить новый access токен.
Добавление кастомных данных (claims) в JWT и реализация logout
- Добавление кастомных claims:
Чтобы добавить кастомные данные в JWT payload, создайте функцию, которая будет добавлять эти данные и зарегистрируйте её в settings.py:
# myapp/utils.py
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
token = super().get_token(user)
# Add custom claims
token['username'] = user.username
token['is_staff'] = user.is_staff
return token
Затем в settings.py:
SIMPLE_JWT = {
'TOKEN_OBTAIN_SERIALIZER': 'myapp.utils.MyTokenObtainPairSerializer',
}
- Реализация logout:
Simple JWT не предоставляет встроенный механизм logout. Для реализации logout необходимо добавить refresh token в черный список (blacklist). Это можно сделать, используя TokenBlacklistView из rest_framework_simplejwt.views.
Создайте view для добавления refresh токена в черный список:
from rest_framework_simplejwt.views import TokenBlacklistView
from rest_framework.permissions import IsAuthenticated
class LogoutView(TokenBlacklistView):
permission_classes = (IsAuthenticated,)
Добавьте URL pattern:
from django.urls import path
from .views import LogoutView
urlpatterns = [
path('logout/', LogoutView.as_view(), name='logout')
]
Заключение: JWT аутентификация в Django Rest Framework
JWT – это мощный инструмент для реализации безопасной аутентификации и авторизации в Django Rest Framework. Simple JWT упрощает процесс работы с JWT, предоставляя готовые view и настройки. В этом туториале мы рассмотрели основные шаги по настройке и использованию JWT, включая создание токенов, защиту эндпоинтов, реализацию refresh токенов и добавление кастомных claims. Использование JWT позволит вам создавать масштабируемые и безопасные API.