Задать вопрос

Почему ругается csrf на анонимного юзера?

Всем привет.

Логика:

1) Пишет анонимный юзер
2) Ему на лету создается аккаунт, который проходит аутентификацию и логин.
3) Автоматически создается пост от его имени.
4) Происходит цикл обновления чата через ajax - выводится его диалог.

Если в чат пишет авторизированный ранее юзер, то все идет без проблем, а если аноним, то на 4 шаге идет CSRF ошибка. Причем если сверять, то CSRF токен на всех шагах один и тот же. Код подрезал немного, чтобы не создавать кучу из внутренних условий вывода

Код создания анонимного юзера и поста от его имени:

def chatpost(request):
    token = {}
    token.update(csrf(request))
    if request.user.is_authenticated():
        ....
    if request.user.is_anonymous():        
        username = randonname
        password = randompass
        email = randomemail

        user = User.objects.create_user(username=username, password=password, email=email)
        user = auth.authenticate(username=username, password=password)
        auth.login(request, user)

        current_user = request.user

        if request.POST:
                    chat_obj = Chat2Model(topic=topic, author=current_user, chattext=chattext)
                    chat_obj.save()

                    json = {}
                    return JsonResponse(json, safe=False, )


Код Ajax:

<script async>

    $('#form_chat').submit(function (e) {
        e.preventDefault();
        var m_chatcom ...
        var m_topic ...

        $.ajax({
            type: "POST",
            url: '/chat/post',
            data: {
                "chatcom": m_chatcom,
                "csrfmiddlewaretoken" : "{{ csrf_token }}",
                "topic": m_topic,
            },
            success: function (data) {

                if (data) {
                }
                else {
                }
            }
        });
    });

</script>


(если ручками рефрешнуть страницу, то и юзер отображается, как авторизованный, и сообщения появляется - т.е. этот код отрабатывает правильно).

Код обновления - вывода чата:

def chatupdate(request):
    if request.POST:

        ... логика выбора нужные чатов, csrf токен и user никак не затрагиваются

        json = {
            "pickup_handler": pickup_handler,
            "break_handler": break_handler,
            "last_chat_pickup": last_chat_pickup,
            "last_chat_break": last_chat_break,
        }

        return JsonResponse(json, safe=False)


<script type="text/javascript">

    function chat(){

        .... - взятие переменных id


        $.ajax({
            type: "POST",
            url: '/chat/update',
            data: {
                "csrfmiddlewaretoken" : "{{ csrf_token }}",
                "m_break": m_break,
                "m_pickup": m_pickup,
                },
            success: function (data) {

                if (data) {
                    $('#new_chat_break').append(data.break_handler);
                    $('#new_chat_pickup').append(data.pickup_handler);

                    var pstr = data.pickup_handler;
                    var bsrt = data.break_handler;

                    }
                else {
                }
                }
            });
        }

    setInterval('chat()', 10000);

</script>
  • Вопрос задан
  • 143 просмотра
Подписаться 1 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
timofeydeys
@timofeydeys
Свобода творцов
Для запросов с отправкой данных, необходимо правильно формировать заголовок, а именно устанавливать заголовок X-CSRFToken: {{ csrf_token }} в ajax запросах. Тут написано больше: https://www.djbook.ru/rel1.9/ref/csrf.html
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы