Где в Django проверяется JWT токен?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Где в 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:
- Middleware - перехватывает запрос, извлекает токен
- REST Framework Authentication - декодирует и проверяет подпись
- Permission Classes - проверяет права доступа
- View Handler - обрабатывает запрос
- Response - возвращает результат
Каждый уровень может отклонить запрос со статусом 401 (Unauthorized).
Заключение
JWT проверка в Django происходит на уровне Middleware и DRF Authentication классов. Это обеспечивает защиту на всех уровнях приложения: от извлечения токена из заголовка Authorization до проверки подписи, валидации срока действия и существования пользователя.