Джанго комментирует ошибку CSRF

Получение ошибки csrf. Я не могу понять, как ее исправить, у меня работает остальная аутентификация, пользователь может обновлять свои данные следующим образом: введите здесь описание изображения

но с комментариями Django я получаю эту ошибку csrf, используя тот же Ошибка токена csrf:

введите здесь описание изображения

Я хотел бы избавиться от этой ошибки в конечной точке /comments/post/, чтобы эта конечная точка вела себя аналогично представлению /rest-auth/user/, которое принимает поле заголовка «Авторизация: токен 792b5fb27b4fe805e895c91274f26b6ab13cb654» для предоставления данных в аутентифицированный пользователь.

Ниже показано действие decotaros, связанных с csrf, на соответствующих представлениях, показанных на снимках экрана: Из конечной точки /comments/post/

@csrf_protect
@require_POST
def post_comment(request, next=None, using=None):
    # Fill out some initial data fields from an authenticated user, if present
    data = request.POST.copy()
    if request.user.is_authenticated():
        if not data.get('name', ''):
            data["name"] = request.user.get_full_name() or request.user.get_username()
        if not data.get('email', ''):
            data["email"] = request.user.email

Из конечной точки /rest-auth/user/

@api_view(['GET'])
@permission_classes((IsAuthenticated, ))
def get_user(request, **kwargs):
    pk = request.data['pk']

    user = MyUser.objects.get(pk=pk)
    serializers = UsersSerializer(user)
    return Response(serializers.data)

person Anon957    schedule 15.12.2015    source источник


Ответы (3)


Декораторы для ваших конечных точек разные, поэтому вам необходимо соответствующим образом настроить заголовки. Для вашего представления /rest-auth/ заголовок WWW-Authenticate требуется как здесь.

Конечная точка представления комментариев /comments/ имеет декораторы csrf_protect, что означает, что заголовок должен соответствовать токену csrf, возвращенному в файле cookie, поскольку Fede упоминает в вашем заголовке, что вам требуется только «X-CSRFToken» с совпадающим значением из файла cookie.

person ArdentBlaze    schedule 15.12.2015

Вы используете неправильный тип контента. Измените его на application/json и повторите попытку.

person mariodev    schedule 15.12.2015
comment
Повторная попытка с использованием application/json по-прежнему приводит к той же ошибке: dl.dropboxusercontent.com/spa/ mcc9m7zsju2myar/s_d20nvj.png - person Anon957; 15.12.2015
comment
Я также пытался отключить поля Referrer и Origin, но по-прежнему получаю сообщение об ошибке. - person Anon957; 15.12.2015
comment
Хорошо Попробуйте очистить куки или использовать почтальона в режиме инкогнито или что-то в этом роде. Вы также можете попробовать отключить рендереры, оставив только один json. - person mariodev; 15.12.2015
comment
Пробовал и это (очистка файлов cookie), но безуспешно: dl.dropboxusercontent.com/spa/mcc9m7zsju2myar /cfp9lks3.png Я попытался сделать это во внешнем клиенте, таком как Paw, чтобы избежать проблем с файлами cookie из Chrome dl.dropboxusercontent.com/spa/mcc9m7zsju2myar/fxvtdwrp.png получает ту же ошибку. - person Anon957; 15.12.2015

Я думаю, вы используете django-rest-framework, который по умолчанию поставляется с освобожденным токеном csfr, но почтальон отправляет токен csfr, поэтому вы получаете эту ошибку.

очистка файлов cookie может решить проблему.

person Fede Scuoteguazza    schedule 15.12.2015
comment
Очистка файлов cookie не помогла, попробовал то же самое, используя Paw (другой клиент для REST OSX), получив ту же ошибку: dl.dropboxusercontent.com/spa/mcc9m7zsju2myar/fxvtdwrp.png - person Anon957; 15.12.2015
comment
Это то, что URL-адрес /comments/post/ указывает на dl.dropboxusercontent.com/ spa/mcc9m7zsju2myar/j-m31w9k.png Это мой первый проект, использующий эти фреймворки, но похоже, что он использует защиту csrf, не уверен, чем это отличается от исключения csfr. - person Anon957; 15.12.2015
comment
Он использует декоратор csrf_protect (docs. djangoproject.com/en/1.6/ref/contrib/csrf/), это означает, что клиенту требуется токен csrf для использования службы. Если вы используете декоратор csfr_exempt (документы .djangoproject.com/en/1.6/ref/contrib/csrf/) Для использования службы токен не потребуется, попробуйте добавить декоратор, и он должен работать. Однако CSRF существует не просто так, вы можете прочитать о нем больше в docs.djangoproject.com/en/1.6/ref/contrib/csrf/ - person Fede Scuoteguazza; 15.12.2015
comment
После того, как я изменил csrf_protect на csrf_exempt, он не выдает ошибку, но правильно ли это? Файл Comment.py, который я отредактировал, является файлом самой структуры, я прав, предполагая, что эти файлы не следует редактировать (поскольку в противном случае они правильно переопределяются вашими файлами проекта)? - person Anon957; 15.12.2015
comment
Я не заметил, что это файл комментариев django. Да, вы не должны изменять этот файл. Вам нужно будет передавать токен CSRF в качестве данных POST с каждым запросом POST. В документации django есть пример того, как это сделать (документы .djangoproject.com/en/1.7/ref/contrib/csrf/#ajax) - person Fede Scuoteguazza; 15.12.2015
comment
передавать токен CSRF в качестве данных POST с каждым запросом POST, это не то, что я делаю, например, на этом рисунке (dl.dropboxusercontent.com/spa/mcc9m7zsju2myar/fxvtdwrp.png)? Возможно ли, что комментарии Django не знают о правильных токенах в моем проекте (комментарии находятся в отдельном приложении от пользователей, которое содержит токены и данные пользователя, но я предполагаю, что django может понять все это из файла настроек, где у нас есть authUserModel и CommentsModel указано)? - person Anon957; 15.12.2015
comment
Я не совсем уверен, что вы отправляете в этом заголовке авторизации, возможно, это авторизация для входа пользователя в систему. для CSRF вы должны установить собственный заголовок X-CSRFToken в значение токена CSRF. Это подробно описано в документации, на которую я ссылался ранее. - person Fede Scuoteguazza; 15.12.2015