⚡ Кратко
📚 Подробно
⚡ Быстрый справочник
pip install djangorestframework-simplejwt
# settings.py
INSTALLED_APPS += ['rest_framework_simplejwt', 'rest_framework_simplejwt.token_blacklist']
REST_FRAMEWORK = {'DEFAULT_AUTHENTICATION_CLASSES': ['rest_framework_simplejwt.authentication.JWTAuthentication']}
SIMPLE_JWT = {'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), 'REFRESH_TOKEN_LIFETIME': timedelta(days=1)}
# Генерация токенов
refresh = RefreshToken.for_user(user)
access_token = refresh.access_token
# Кука
response.set_cookie(key='access_token', value=str(access_token), httponly=True, secure=True, samesite='Lax')
response.delete_cookie('access_token')
# Проверка exp
from datetime import datetime, timezone
datetime.fromtimestamp(token['exp'], tz=timezone.utc)
# Middleware
request.META['HTTP_AUTHORIZATION'] = f'Bearer {access_token}'
Установка и настройка
Установка пакета
pip install djangorestframework-simplejwt
INSTALLED_APPS
INSTALLED_APPS = [
'rest_framework_simplejwt',
'rest_framework_simplejwt.token_blacklist', # если BLACKLIST_AFTER_ROTATION=True
]
REST_FRAMEWORK — аутентификация по умолчанию
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_simplejwt.authentication.JWTAuthentication',
],
}
Параметры SIMPLE_JWT
Ключ Тип Описание
ACCESS_TOKEN_LIFETIMEtimedelta Срок жизни access-токена (по умолч. 5 мин)
REFRESH_TOKEN_LIFETIMEtimedelta Срок жизни refresh-токена (по умолч. 1 день)
ROTATE_REFRESH_TOKENSbool Выдавать новый refresh при обновлении
BLACKLIST_AFTER_ROTATIONbool Аннулировать старый refresh после ротации
AUTH_HEADER_TYPEStuple Схема токена: ('Bearer',)
ALGORITHMstr Алгоритм подписи (по умолч. 'HS256')
SIGNING_KEYstr Ключ подписи (по умолч. SECRET_KEY)
Работа с токенами
Класс RefreshToken
Метод / атрибут Описание
RefreshToken.for_user(user)Создаёт refresh-токен для пользователя
refresh.access_tokenВозвращает access-токен
str(refresh)Сериализует refresh-токен в строку (JWT)
str(access_token)Сериализует access-токен в строку
refresh['exp']Unix-timestamp истечения refresh-токена
access_token['exp']Unix-timestamp истечения access-токена
refresh.blacklist()Добавляет токен в blacklist
Класс AccessToken
Метод / атрибут Описание
AccessToken(token_string)Создаёт объект из строки; валидирует подпись и срок
token['exp']Unix-timestamp истечения токена
token['user_id']ID пользователя из payload
Исключения
Исключение Когда возникает
TokenErrorБазовый класс: неверный формат, недействительный токен
InvalidTokenПодпись не совпадает или токен в blacklist
TokenBackendErrorОшибки декодирования на уровне backend
Методы Response для работы с куками
response.set_cookie()
response.set_cookie(
key='access_token', # имя куки
value=str(access_token), # значение (JWT-строка)
httponly=True, # запрет чтения через JS
secure=False, # только HTTPS (True в продакшне)
samesite='Lax', # защита от CSRF
expires=datetime_obj, # datetime истечения
max_age=None, # альтернатива expires (секунды)
path='/', # путь действия куки
domain=None, # домен (None = текущий)
)
response.delete_cookie()
response.delete_cookie('access_token') # удалить куку из браузера
response.delete_cookie('refresh_token')
request.COOKIES.get()
access_token = request.COOKIES.get('access_token') # None если нет
refresh_token = request.COOKIES.get('refresh_token')
MiddlewareMixin — справочник
Метод Когда вызывается Аргументы
process_request(request)До передачи запроса в представление request
process_response(request, response)После получения ответа от представления request, response; обязан вернуть response
process_view(request, view, args, kwargs)До вызова представления, после роутинга request, view callable, args, kwargs
process_exception(request, exception)При исключении в представлении request, exception
Подключение в settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
# ... другие middleware ...
'your_app.middleware.JWTAuthenticationMiddleware',
]
Порядок middleware важен: JWTAuthenticationMiddleware должен стоять после встроенных middleware безопасности Django, чтобы они успели обработать запрос перед аутентификацией.
RegisterSerializer — справочник
Компонент Описание
serializers.ModelSerializerБазовый класс; автоматически генерирует поля из модели
serializers.CharField(write_only=True)Поле только для записи — не включается в ответ
Meta.modelМодель Django (User)
Meta.fieldsСписок полей для сериализации
create(validated_data)Переопределение создания объекта
User.objects.create_user()Создаёт пользователя с хэшированным паролем
URL-маршруты
# urls.py — все маршруты урока
from django.urls import path
from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView
from .views import LoginView, LogoutView, RegisterView
urlpatterns = [
# Стандартные SimpleJWT-эндпоинты (альтернатива кастомному LoginView)
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
# Кастомные эндпоинты с куками (из лекции)
path('api/login/', LoginView.as_view(), name='login'),
path('api/logout/', LogoutView.as_view(), name='logout'),
path('api/register/', RegisterView.as_view(), name='register'),
]