🔖 Справочник — Урок 44

← К оглавлению урока

⚡ Быстрый справочник

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'),
]