Django: Middleware для шифрования JWT-токенов и установки cookie-файлов

Я работаю над реализацией шифрования JWT-токенов в моем Django-приложении с помощью rest_framework_simplejwt. Я создал пользовательское промежуточное ПО TokenEncryptionMiddleware, которое шифрует токены доступа и обновления перед тем, как установить их в качестве cookies. Однако клиентская сторона, похоже, получает незашифрованный ответ от TokenObtainPairView.

Что я здесь упускаю? Существуют ли какие-либо взаимодействия между rest_framework_simplejwt и пользовательским промежуточным ПО, о которых я должен знать, чтобы мое шифрование работало так, как задумано?

Вот мой код промежуточного ПО:

"""
Middleware for crypting the JWT tokens before setting them as cookies.
"""

from base64 import urlsafe_b64encode
from cryptography.fernet import Fernet
from django.conf import settings
from django.utils.deprecation import MiddlewareMixin


class TokenEncryptionMiddleware(MiddlewareMixin):
    """
    Middleware to encrypt the JWT tokens before setting them as cookies.
    """

    def process_response(self, request, response):
        """
        Encrypts the JWT tokens before setting them as cookies.
        """
        if response.status_code == 200 and (
            "access" in response.data and "refresh" in response.data
        ):
            base_key = settings.JWT_KEY.encode()[:32]
            cipher = Fernet(urlsafe_b64encode(base_key))

            encrypted_access_token = cipher.encrypt(
                response.data["access"].encode()
            ).decode()
            encrypted_refresh_token = cipher.encrypt(
                response.data["refresh"].encode()
            ).decode()

            del response.data["access"]
            del response.data["refresh"]

            response.set_cookie(
                "access_token",
                encrypted_access_token,
                httponly=True,
                secure=True,
                samesite="Strict",
            )
            response.set_cookie(
                "refresh_token",
                encrypted_refresh_token,
                httponly=True,
                secure=True,
                samesite="Strict",
            )

        return response

Заказ среднего оборудования

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
    "middlewares.crypter.TokenEncryptionMiddleware",
]

Ожидаемое поведение:

Клиент должен получить cookies с именами access_token и refresh_token, содержащие зашифрованные JWT-токены.

Для создания пользовательского промежуточного ПО в виде класса требуется волшебный метод.

class TokenEncryptionMiddleware(MiddlewareMixin):
    """
    Middleware to encrypt the JWT tokens before setting them as cookies.
    """
    def __init__(self, get_response):
        self.get_response = get_response
        
    def __call__(self, request):

        response = self.get_response(request)
        self.process_response(request, response)

        return response

    def process_response(self, request, response):
        """
        Encrypts the JWT tokens before setting them as cookies.
        """
        ...

В Django Middleware метод __call__magic вызывается при запросе, ответе.

Предполагается, что процесс шифрования вашего токена jwt будет выполняться в ответе, поэтому я добавил его в метод __call__magic.

Вернуться на верх