← Назад к вопросам

Где в Django проверяется JWT токен?

2.0 Middle🔥 221 комментариев
#REST API и HTTP#Безопасность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Где в Django проверяется JWT токен?

JWT токены проверяются на нескольких уровнях в Django приложении. Рассмотрю полный цикл проверки.

1. Middleware - первая линия защиты

Основная проверка JWT происходит в Middleware слое. Это первое место, где обрабатывается запрос:

from django.utils.deprecation import MiddlewareMixin
from rest_framework.authtoken.models import Token
from rest_framework_simplejwt.authentication import JWTAuthentication

class JWTAuthMiddleware(MiddlewareMixin):
    def process_request(self, request):
        auth_header = request.META.get('HTTP_AUTHORIZATION', '')
        
        if not auth_header.startswith('Bearer '):
            return None
        
        token = auth_header.split(' ')[1]
        jwt_auth = JWTAuthentication()
        
        try:
            user, validated_token = jwt_auth.authenticate(request)
            request.user = user
            request.token = validated_token
        except Exception as e:
            return None
        
        return None

2. Django REST Framework Authentication Classes

Если используешь DRF (Django REST Framework), проверка JWT объявляется в settings.py:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

Проверка происходит в методе authenticate() класса JWTAuthentication:

class JWTAuthentication(BaseAuthentication):
    def authenticate(self, request):
        raw_token = self.get_raw_token(request)
        if raw_token is None:
            return None
        validated_token = self.get_validated_token(raw_token)
        return self.get_user(validated_token), validated_token

3. View/Serializer уровень

Вы можете добавить дополнительную проверку на уровне views:

from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated

class ProtectedView(APIView):
    permission_classes = [IsAuthenticated]
    
    def get(self, request):
        return Response({'user': request.user.username})

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def protected_endpoint(request):
    return Response({'message': f'Hello, {request.user.username}'})

4. Кастомная проверка в Serializer

from rest_framework import serializers
from rest_framework_simplejwt.tokens import AccessToken

class TokenVerifySerializer(serializers.Serializer):
    token = serializers.CharField()
    
    def validate_token(self, value):
        try:
            AccessToken(value)
        except Exception as e:
            raise serializers.ValidationError(f'Invalid token: {str(e)}')
        return value

5. Полный цикл проверки JWT в Django

from rest_framework_simplejwt.tokens import AccessToken
from django.conf import settings
import jwt
from datetime import datetime

def verify_jwt_token(token_string):
    try:
        payload = jwt.decode(
            token_string,
            settings.SECRET_KEY,
            algorithms=['HS256']
        )
        
        exp_timestamp = payload.get('exp')
        if exp_timestamp:
            if datetime.utcfromtimestamp(exp_timestamp) < datetime.utcnow():
                return False, 'Token expired'
        
        user_id = payload.get('user_id')
        from django.contrib.auth.models import User
        try:
            user = User.objects.get(id=user_id)
            return True, user
        except User.DoesNotExist:
            return False, 'User not found'
            
    except jwt.ExpiredSignatureError:
        return False, 'Token has expired'
    except jwt.InvalidTokenError:
        return False, 'Invalid token'

6. Кастомная Permission класс

from rest_framework.permissions import BasePermission

class IsTokenValid(BasePermission):
    def has_permission(self, request, view):
        auth_header = request.META.get('HTTP_AUTHORIZATION', '')
        
        if not auth_header.startswith('Bearer '):
            return False
        
        token = auth_header.split(' ')[1]
        
        try:
            jwt_auth = JWTAuthentication()
            user, _ = jwt_auth.authenticate(request)
            request.user = user
            return True
        except:
            return False

Порядок проверки JWT в Django:

  1. Middleware - перехватывает запрос, извлекает токен
  2. REST Framework Authentication - декодирует и проверяет подпись
  3. Permission Classes - проверяет права доступа
  4. View Handler - обрабатывает запрос
  5. Response - возвращает результат

Каждый уровень может отклонить запрос со статусом 401 (Unauthorized).

Заключение

JWT проверка в Django происходит на уровне Middleware и DRF Authentication классов. Это обеспечивает защиту на всех уровнях приложения: от извлечения токена из заголовка Authorization до проверки подписи, валидации срока действия и существования пользователя.