Django Rest Framework APIView без исключения CSFR - PullRequest
0 голосов
/ 20 июня 2020

Выполнение POST-запросов для регистрации нового пользователя через почтальона возвращает 403 Forbidden, проверка CSRF не удалась. Запрос прерван ... Идет по DRF документация и knox auth documentation У меня все настроено правильно. Похоже, что Django SessionAuthentication активируется, хотя у меня его нет в моем DEFAULT_AUTHENTICATION_CLASSES. Я пробовал все возможные решения, которые мог найти, но ничего не работает. Приложение представляет собой Django rest api с интерфейсом React. Любая помощь будет принята с благодарностью.

Настройки аутентификации и разрешений

'DEFAULT_AUTHENTICATION_CLASSES': (
    'knox.auth.TokenAuthentication',
),

'DEFAULT_PERMISSION_CLASSES': (
    'rest_framework.permissions.AllowAny',
),

URL-адрес, вызывающий представление as_view

re_path('auth/register', Register.as_view(), name='register'),

Представление регистров на основе классов, расширяющее APIView, которое должно обрабатывать csrf

class Register(APIView):
    """User Registration API View"""

    def post(self, request, *args, **kwargs):
        if request.method == 'POST':
            serializer = RegistrationSerializer(data=request.data)
            data = {}
            if serializer.is_valid():
                user = serializer.save()
                data['response'] = 'Account registered successfully'
                data['firstName'] = user.first_name
                data['lastName'] = user.last_name
                data['email'] = user.email
                data['token'] = AuthToken.objects.get(user=user).key
                return Response(data, status=status.HTTP_201_CREATED)

            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Ошибка трассировки стека

Forbidden (CSRF cookie not set.): /api/account/auth/register
[20/Jun/2020 12:15:14] "POST /api/account/auth/register HTTP/1.1" 403 2864

Обновление Я нашел проблему и добавил ее в качестве ответа ниже

1 Ответ

0 голосов
/ 20 июня 2020

Я надеюсь, что это может помочь всем, кто может оказаться в такой ситуации. Похоже, что, поскольку я интегрирую React с Django и использую маршрутизатор React, URL-адреса Django должны быть размещены перед URL-адресами React в базовом файле urls.py, иначе маршрутизатор React принимает запрос и запускает его через свой маршрутизатор, не может найти любые совпадающие URL-адреса и выдает ошибку, поэтому он никогда не проходит через конечные точки Django api. Это объясняет, почему я получал ошибки CSRF, поскольку SessionAuthentication Django проходил через маршрутизатор React. После всего тестирования ответ был так же прост, как замена двух строк.

Предыдущие ошибки выдачи

urlpatterns = [
    # Admin portal
    re_path('admin/', admin.site.urls),

    # React UI Entry
    re_path('', include('frontend.urls'), name='frontend'),

    # Rest API Urls
    re_path('api/account/', include('account.api.urls'), name='account_api'),
]

Исправлено отсутствие ошибок

urlpatterns = [
    # Admin portal
    re_path('admin/', admin.site.urls),

    # Rest API Urls
    re_path('api/account/', include('account.api.urls'), name='account_api'),

    # React UI Entry
    re_path('', include('frontend.urls'), name='frontend'),
]
...