Django csrf_exempt не работает с SessionAuthentication

Я использую Django Rest Framework для создания веб-приложения с регистрацией пользователя / логином.
Я пытаюсь освободить представление регистрации пользователя от необходимости токена CSRF. Это то, что мой взгляд выглядит прямо сейчас:

class UserSignUpView(generics.CreateAPIView):
    permission_classes = [] # FIXME: doesn't seem to be working
    serializer_class = UserSerializer

    @method_decorator(csrf_exempt)
    def post(self, request, *args, **kwargs):
        super().post(self, request, *args, **kwargs)

    def get_permissions(self):
        if self.request.method == 'POST':
            return (permissions.AllowAny(), TokenHasReadWriteScope())
        return False

Мой settings.py выглядит так:

REST_FRAMEWORK = {
    # Use Django's standard `django.contrib.auth` permissions,
    # or allow read-only access for unauthenticated users.
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': [
       'rest_framework.permissions.AllowAny',
    ]
}

Я все еще получаю это на моем выходе backend Forbidden (CSRF cookie not set.): /users/и в переднем конце классика CSRF verification failed. Request aborted.

Почему это не сработает? Может ли это быть связано с тем, что я никогда не устанавливал файл cookie CSRF вручную?

1 ответ

  1. Django Rest framework уже CSRFViewMiddlewareпредотвращает выполнение проверки CSRF с помощью csrf_exemptлюбого APIView. Вместо этого он явно вызывает проверку CSRF, когда пользователь успешно аутентифицируется с помощью SessionAuthentication. Вы не можете обойти эту проверку, и не должны. Обычное представление Django может не зависеть от сеанса, в этом случае атака CSRF невозможна, и вы можете использоватьcsrf_exempt, чтобы указать на это. При использовании SessionAuthenticationвы уязвимы для атак CSRF, и вам нужна проверка, чтобы предотвратить атаки. Обход проверки в этом случае неизбежно открывает перед вами уязвимость, поэтому DRF не позволяет отключить проверку.

    Вы в основном есть два варианта, чтобы исправить это:

    • Убедитесь, что пользователь не прошел проверку подлинности SessionAuthentication.
    • Убедитесь, что файл cookie установлен, и отправьте маркер в заголовок X-CsrfTokenзапроса.