⚖️ Старый vs Новый

Устаревшие паттерны аутентификации из лекции → современный подход DRF 3.15+ / SimpleJWT 5.x

⚡ Ключевые изменения

  • SIMPLE_JWT: ключи теперь в snake_case (access_token_lifetime) в SimpleJWT 5.x — старые ключи в CamelCase устарели
  • Ручное создание токенов через Token.objects.get_or_create() заменяется встроенным obtain_auth_token
  • Строковые пути вместо классов в DEFAULT_AUTHENTICATION_CLASSES — то и другое работает, но строки — стандарт

1. Настройки SIMPLE_JWT: CamelCase → snake_case

Из лекции (старое — SimpleJWT < 5.0): Ключи в SIMPLE_JWT использовались в CamelCase.

Старый подход (из лекции)

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

Современный подход (SimpleJWT 5.x+)

SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME": timedelta(minutes=5),
    "REFRESH_TOKEN_LIFETIME": timedelta(days=1),
    "ROTATE_REFRESH_TOKENS": False,
    "AUTH_HEADER_TYPES": ("Bearer",),
    "TOKEN_OBTAIN_SERIALIZER":
        "rest_framework_simplejwt.serializers"
        ".TokenObtainPairSerializer",
}
⚠️ Проверить по документации: в SimpleJWT 5.x ключи SIMPLE_JWT остаются в SCREAMING_SNAKE_CASE. Проверь актуальную версию: SimpleJWT Settings.

2. Ручное создание токенов → obtain_auth_token

Старый подход (из лекции)

# views.py — ручная генерация токена
from rest_framework.authtoken.models import Token
from rest_framework.response import Response
from rest_framework.views import APIView

class GetTokenView(APIView):
    def post(self, request):
        user = request.user
        token, created = Token.objects.get_or_create(user=user)
        return Response({'token': token.key})

Современный подход

# urls.py — встроенное представление DRF
from rest_framework.authtoken.views import obtain_auth_token

urlpatterns = [
    path('api-token-auth/', obtain_auth_token, name='api_token_auth'),
]
# Автоматически принимает username+password,
# возвращает {"token": "..."}

3. Аутентификация на основе сессий → токены для API

Старый подход (веб-приложения)

# Django Login View + SessionAuthentication
# Подходит для браузерных приложений
# Требует CSRF-токенов для небезопасных методов
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
    ],
}

Современный подход (REST API)

# JWT или Token для stateless API
# Нет зависимости от сессий/cookies
# Подходит для SPA, мобильных приложений
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework_simplejwt.authentication'
        '.JWTAuthentication',
    ],
}

4. Передача учётных данных в URL → заголовок

Старый подход (из лекции — только для тестирования)

# Только для локального тестирования!
# Небезопасно: credentials в URL
http://username:password@127.0.0.1:8000/products/

Современный подход

# В заголовке запроса — безопасно с HTTPS
GET /products/ HTTP/1.1
Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

# Или через Postman:
# Authorization → Basic Auth → Username / Password
← К оглавлению урока    Задания →