Почему при отправке формы с помощью axios — не видно работы защитника csrf (Laravel)?
Я отправляю форму через axios в которой нет поля защитника csrf - и не получаю никаких ошибок, почему?
Если эу форму отправляю обычным пост-запросом - то получаю пустую страницу 'The page has expired due to inactivity. Please refresh and try again.". Так и должно быть?
Илья Герасимов, вижу что есть в Request Headers "Cookie: X-CSRF-TOKEN =ey..." и больше никаких токенов. И опять же при обычном пост запросе если убираю поле с токеном - получаю пустую страницу 'The page has expired due to inactivity. Please refresh and try again." без ошибок. Этого я раньше не спрашивал.
Метод getTokenFromRequest получает csrfToken из переданной формы или из заголовка.
Метод tokensMatch сверяет полученный токен с тем, что привязан к сессии.
Если проверка не проходит, бросается TokenMismatchException.
Вы написали "axios подхватывает csrf из мета тега и отправляет его заголовком" - мистика но у меня в метатегах нет csrf - а в заголовке он отправляется. Откуда он берется тогда?
Дмитрий Кузнецов, csrf токены нужны в рамках сессии, если вы хотите предоставлять что-то вроде api сервиса и иметь к нему доступ с разных адресов/устройств, стоит отказаться от сессионной авторизации и рассмотреть другие способы авторизации клиента, например, авторизация посредством подписанных токенов, это когда мы выполняем запрос на авторизацию (передаем логин, пароль, естественно по ssl) в ответ получаем токен подписанный нашим backend сервером и содержащим в себе некую информацию в виде ключа, с которым дальше работаем (либо устанавливаем постоянное соединение и единожды передаем его, либо постоянно передаем его в запросе), при таких условиях csrf токен не нужен и этот способ более гибкий, мы можем выписывать множество токенов доступа, выдавать привилегии на токен и в любой момент ограничить доступ. То, что я написал поддерживает Laravel passport вам нужно лишь авторизовать клиента, выдав ему токен доступа, после чего взаимодействовать с клиентом доверяя этому токену, и возможно еще придется дописать csrfMiddleware чтобы тот пропускал запросы с вашим подписанным токеном, на следующий шаг.
semki096, зашифрованный csrf токен так же пишется в куки и если не передать токен формой или заголовком, лара пробует вытянуть X-XSRF-TOKEN и расшифровать, если все не в точку, то смотри свой код, ничем не могу помочь, возможно твоя проблема в твоем csrf мидлваре, возможно он пропускает XMLHttpRequest запросы без проверки csrf токена.
Кажется я понял. Axios автоматически берет значение из куки - и помещает его в заголовок X-XSRF-TOKEN. Поэтому прописывать ни в форме ни в хедере ничего не надо. Не знаю насколько я прав, поправьте если что.
Нужно прописывать и в форме и в мета-теге (это удобно).
В куки помещается зашифрованный csrf токен после первой успешной проверки переданного токена посредством формы или ajax запроса. Т.е если тупо ни разу не передать токен, то и в куках у нас ничего не появится. Значение из кук проверяется в последнюю очередь (правильнее даже сказать не кук, а заголовка X-XSRF-TOKEN).