Почему не отправляется csrf токен автоматически?
Почему не отправляется csrf токен автоматически?
В проекте включена csrf-валидация. В лайауте есть $this->registerCsrfMetaTags(), но когда я отправляю ajax-запрос джаваскриптовым fetch у меня не прокидывается токен и не пускает запрос. Почему так происходит? Насколько я понимаю мета-теги должны автоматически во все запросы добавляться или нет?
Re: Почему не отправляется csrf токен автоматически?
Если вы заметили, все формы, генерируемые через ActiveForm или Html-хелпер, уже содержат в себе эти параметры. В этом, как я понял, и заключается автоматизация, о которой вы говорите. Но в js-коде надо уже самостоятельно отправлять эти параметры.
Можно прописать у себя в js такой код:
И при вызове ajax пихать туда дополнительно и их помимо основного.
Можно прописать у себя в js такой код:
Код: Выделить всё
let csrfParam = $('meta[name="csrf-param"]').attr("content");
let csrfToken = $('meta[name="csrf-token"]').attr("content");
-
- Сообщения: 19
- Зарегистрирован: 2019.02.28, 11:18
Re: Почему не отправляется csrf токен автоматически?
Или без jquery:
Код: Выделить всё
var token = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
Re: Почему не отправляется csrf токен автоматически?
Да нет. Речь не об этом. Я знаю как получить токен из JS. Я просто думал что он должен автоматически добавляться к запросу. Помнится в других проектах у меня так и происходило. Я не добавлял его в запрос вручную.
Re: Почему не отправляется csrf токен автоматически?
Кажется он в куках должен передаваться или в сессии
Re: Почему не отправляется csrf токен автоматически?
Он отправляется автоматически только если использовать средства генерации Yii
Если же свой js код: fetch, jQuery, axios, и т.п. то всегда устанавливал его в глобальных параметрах используемой библиотеки, в заголовке для всех запросов.
бекенд Yii2 ищет его вначале в теле запроса. Если не находит ищет в заголовке.
Наверное вы просто не обратили на это внимание в других проектах. Работало - и ладно, незачем было копать как оно там работает.
Никак нет.
csrf указывает что страница была сгенерена именно Yii2, и таким образом защищает от запросов которые приходят с какой-то чужой страницы
В алгоритм генерации не вникал.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Тем более что окажется что оно вам и не нужно было, странное это.
Re: Почему не отправляется csrf токен автоматически?
Окей, а как быть с DELETE-запросами? Они ведь тоже защищаются вроде. Но тела не имеют. Тут только в хедере прокидывать? Что-то у меня не получается так...
Re: Почему не отправляется csrf токен автоматически?
я всегда в хеадере прокидываю
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Тем более что окажется что оно вам и не нужно было, странное это.
Re: Почему не отправляется csrf токен автоматически?
А может попробовать по другому выполнить запрос? Ощущение, что обычная задача, а решают сложным способом
Код: Выделить всё
$js = "
$(document).ready(function(){
$('#buttonID').on('click', function(e){
$.ajax({
type: 'POST',
url: '".$model->url."', //нужный УРЛ
success: function(result) {
$('#IDS').html(result); //в нужном месте будет возвращаться $this->renderAjax из контроллера
}
});
});
});
";
$this->registerJs($js);
Re: Почему не отправляется csrf токен автоматически?
Не знаю сложно ли
Вот, покопался в старом проекте (сейчас у нас SPA,csrf поэтому не используется никак)
Код: Выделить всё
function yiiCSRF(data, opts) {
var res = {};
Object.assign(res, data || {});
res[$('meta[name="csrf-param"]').attr("content")] = $('meta[name="csrf-token"]').attr("content");
return opts == 'json' ? (JSON.stringify(res)) : res;
}
let _csrf = Object.values(yiiCSRF())[0];
$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
jqXHR.setRequestHeader('X-CSRF-Token', _csrf);
});
ко всем запросам с помощью jQuery будет добавляться нужное поле заголовка и значение.
функция yiiCSRF есть в yii.js, но так вообще гарантировано, даже если yii.js не подключен виджетом - будет работать.
у axios аналогичная есть.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Тем более что окажется что оно вам и не нужно было, странное это.
Re: Почему не отправляется csrf токен автоматически?
Для чего тогда использовать фреймворк, если требуется самостоятельная передача csrf?
Нашел простое решение в первой ссылке гугла, по сути то, что человеку и надо было
При необходимости дополнительных параметров param1: param1. Как написал ранее Proksius
Код: Выделить всё
var csrfParam = $('meta[name="csrf-param"]').attr("content");
var csrfToken = $('meta[name="csrf-token"]').attr("content");
$.ajax({
url: 'URL',
type: 'post',
dataType: 'json',
data: {param1: param1, csrfParam : csrfToken},
});
Re: Почему не отправляется csrf токен автоматически?
когда нужен свой js код.
можно и так. это тоже самое, выше ж писал - "в заголовке или теле передается".
но когда у тебя js часть уже наполовину SPA - зачем копипастить код к каждому запросу, когда можно выставить один раз заголовок для всех запросов
и примените приведенный вами "более простого" кода к GET запросам.
Не желайте странного, и не будет у вас головной боли чтобы достичь этого странного.
Тем более что окажется что оно вам и не нужно было, странное это.
Тем более что окажется что оно вам и не нужно было, странное это.