Как аутентифицировать пользователя в Django rest framework с помощью http only cookie

Я использую Django и Django Rest Framework для бэкенда и Next JS для фронтенда.

Я использую аутентификацию JWT. При запросе с фронтенда я выдаю http only cookie для хранения во фронтенде.

Мой вопрос в том, как я могу разрешить частной конечной точке использовать этот cookie?

Код для генерации Cookie


def get_tokens_for_user(user):
    refresh = RefreshToken.for_user(user)

    return {
        'refresh': str(refresh),
        'access': str(refresh.access_token),
    }


class LoginView(APIView):
    def post(self, request, format=None):
        data = request.data
        response = Response()
        email = data.get('email', None)
        password = data.get('password', None)
        user = authenticate(username=email, password=password)
        if user is not None:
            if user.is_active:
                data = get_tokens_for_user(user)
                
                response.set_cookie(key='token', value=data["access"], httponly=True, samesite='None', secure=True,
                                    expires=settings.SIMPLE_JWT['ACCESS_TOKEN_LIFETIME'])
                
                response.data = data

                return response
            else:
                return Response({"detail": "This account is not active!!"}, status=status.HTTP_404_NOT_FOUND)
        else:
            return Response({"detail": "Invalid username or password!!"}, status=status.HTTP_404_NOT_FOUND)

Код для компонента входа во фронтенд

interceptor
      .post("/token/", data, {
        withCredentials: true,
      })
      .then((res) => {
        router.query?.from
          ? router.push(router.query?.from)
          : router.push("/admin");
      })

Другие API частных маршрутов

class BlogTagsView(generics.ListCreateAPIView):
    """
    List of Blog Tags
    """
    permission_classes = [apipermissions.IsSuperUser]
    queryset = models.TagModel.objects.all()
    serializer_class = serializers.TagSerializers

settings.py


REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        # 'rest_framework.authentication.BasicAuthentication',
        # 'rest_framework.authentication.SessionAuthentication',
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ),
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
        'rest_framework.parsers.FileUploadParser',
    ],
    
}

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=60),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=90),
    'ROTATE_REFRESH_TOKENS': True,
    'BLACKLIST_AFTER_ROTATION': True,
    'UPDATE_LAST_LOGIN': True,
    # 'AUTH_COOKIE': 'token',
    # 'AUTH_COOKIE_HTTP_ONLY': True,

    'ALGORITHM': 'HS256',
    'SIGNING_KEY': SECRET_KEY,
    'VERIFYING_KEY': None,
    'AUDIENCE': None,
    'ISSUER': None,
    'JWK_URL': None,
    'LEEWAY': 0,

    'AUTH_HEADER_TYPES': ('Bearer',),
    'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
    'USER_ID_FIELD': 'id',
    'USER_ID_CLAIM': 'user_id',
    'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',

    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
    'TOKEN_TYPE_CLAIM': 'token_type',
    'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser',

    'JTI_CLAIM': 'jti',

    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
    'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}
CORS_ALLOW_ALL_ORIGINS = True
CORS_ALLOW_CREDENTIALS = True

В классе BlogTagsView он должен был открываться для получения запроса и разрешения администратора, необходимого для запроса сообщения.

Итак, мой вопрос в том, как я могу отправлять сообщения из фронтенда и как я могу проверить и ограничить доступ к запросу на отправку сообщения в бэкенде?

Спасибо.

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