СООБЩЕНИЕ Ajax не распознано как часть текущего гостевого сеанса, Laravel 5.3

#php #ajax #laravel #laravel-5.3

#php #ajax #laravel #laravel-5.3

Вопрос:

У меня есть страница, которая после открытия отправляет серию сообщений ajax в конечную точку уведомления. Я хотел бы сохранить данные в сообщениях, используя гостевой сеанс. Входа нет, но контекстное управление независимо. Я использую cookies.

У меня возникают проблемы с восстановлением объектов из сеанса из-за этих запросов ajax (они приходят нулевыми), и я заметил, что при каждом сообщении в конечную точку уведомления я получаю другое значение для request()->session()->getId() , что заставляет меня думать, что сеанс не передается должным образом, и именно поэтому я не вижу, чтобы объекты, которые я ожидал увидеть, сохранялись.

Мои URL-адреса используют промежуточное программное обеспечение «web».

Каждый раз, когда страница открывается, я делаю:

 <script>
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': '<?php echo csrf_token(); ?>'
        }
    });
</script>
  

Чтобы гарантировать, что запросы ajax будут иметь токен CSRF в заголовке

Я также выполняю ‘request ()-> session ()-> regenerate();’каждый раз, когда открывается страница (не в уведомлениях), чтобы обеспечить новый сеанс.

Есть ли что-нибудь еще (возможно, переданные значения из файлов cookie), что я должен отправить в СООБЩЕНИИ, чтобы идентифицировать запрос как часть контекста?

Комментарии:

1. Пожалуйста, можете ли вы показать свой код для этого? т. Е. ваш метод контроллера и ваш ajax-запрос?

Ответ №1:

Вы должны сделать его без состояния.

  • Отправьте запрос от клиента к серверу
  • Сервер генерирует и возвращает «токен»
  • Клиент получает токен и сохраняет его, например, в локальном хранилище
  • Клиент отправляет с каждым запросом токен в качестве заголовка (или в качестве параметра в URL)
  • (сервер проверяет токен из заголовка)

Преимуществом является ваша независимость от обработки сеанса.

Комментарии:

1. Я сделал это, используя отметку времени в миллисекундах в качестве токена, и решил свою проблему! Есть ли какой-либо «Laravel way» для генерации какого-либо более надежного токена? Или CSRF должен позаботиться о безопасности, и я могу придерживаться метки времени?

2. @PauloAmaral Я предпочитаю хэширование с помощью ключа. Смотрите php.net/manual/en/function.hash-hmac.php

Ответ №2:

         var _id     = 1011;
        var url     = "/test";

        $.ajax({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            },
            beforeSend: function(){

            },
            url: url,
            data: {id: _id},
            type: 'POST',
            dataType: 'json',
            success: function(result){

            }
        });
  

Комментарии:

1. Это была одна из моих первых попыток, неудачная, кстати. Согласно моим исследованиям, токен CSRF больше связан с обеспечением надежности клиентских запросов, а не с уникальностью сеанса, верно?

2. токен csrf предотвращает атаки csrf

3. скопируйте этот код => <meta name=»csrf-token» content=»{{ csrf_token() }}»>