Как отправить csrf token на сервер без формы ? [Решено]

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Как отправить csrf token на сервер без формы ? [Решено]

Сообщение nepster »

Подскажите пожалуйста как отправить csrf token на сервер без формы, например в ситуации, когда нужно просто на жать на кнопку и отправить данные на сервер, куда и как лучше всего добавить csrf token на странице ?
Последний раз редактировалось nepster 2014.07.24, 13:21, всего редактировалось 1 раз.
nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Как отправить csrf token на сервер без формы ?

Сообщение nepster »

Там все ссылки ведут на 404 страницу.

Я хотел уточнить несколько моментов:

1) Я добавил следующие мета теги:

Код: Выделить всё

$this->registerMetaTag(['name' => 'csrf-param', 'content' => Yii::$app->getRequest()->csrfParam], 'csrf-token');
$this->registerMetaTag(['name' => 'csrf-token', 'content' => Yii::$app->getRequest()->getCsrfToken()], 'csrf-param'); 
2) К примеру у меня есть виджет, который должен двигать стрелочку туда-сюда при нажатии на нее. JS код реализовал вот так:

Код: Выделить всё

(function ($) {
    var param = $('meta[name=csrf-param]').attr("content");
    var token = $('meta[name=csrf-token]').attr("content");
    
    $(document).on('click', '.side-activations.active', function(){
        
        var el     = this;
        var elHtml = $(this).parent().html();
        
        var data = {};
            data[param] = token;
        $.ajax({
            url: $(this).data("url"),
            type: 'POST',
            data: data,
            success: function(response, textStatus, jqXHR) {
                if(response == 'L' || response == 'R'){
                    $(el).remove();
                    var side = response;
                    $('.lide-'+side).html(elHtml);
                }
            }
        });
        return false;
    });
})(jQuery);
 

Вариант конечно рабочий и при этом вопрос такой, хороший ли это вариант ? Тоесть возможно есть ситуации, где можно было что-то сделать лучше ?
Аватара пользователя
yiijeka
Сообщения: 3103
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: Как отправить csrf token на сервер без формы ?

Сообщение yiijeka »

А почему вы сразу в виджете не подставляете в ajax, создаёте кучу лишних переменных ?

Код: Выделить всё

// ...
 data: {'<?= Yii::$app->request->csrfParam ?>' : '<?= Yii::$app->request->getCsrfToken()?>' },
//...
Аватара пользователя
Faenir
Сообщения: 292
Зарегистрирован: 2010.01.06, 01:46
Откуда: Симферополь

Re: Как отправить csrf token на сервер без формы ?

Сообщение Faenir »

Вот есть же:

Код: Выделить всё

<?= Html::csrfMetaTags() ?>
https://github.com/yiisoft/yii2/blob/ma ... in.php#L20

Для получения в JS тоже так делаю, вроде проблем не было пока)

Код: Выделить всё

var param = $('meta[name=csrf-param]').attr("content");
var token = $('meta[name=csrf-token]').attr("content"); 
nepster
Сообщения: 838
Зарегистрирован: 2013.01.02, 03:35

Re: Как отправить csrf token на сервер без формы ?

Сообщение nepster »

большое спасибо. Про Html::csrfMetaTags() не знал.
Vespertilio
Сообщения: 271
Зарегистрирован: 2012.11.30, 07:33

Re: Как отправить csrf token на сервер без формы ?

Сообщение Vespertilio »

nepster писал(а):большое спасибо. Про Html::csrfMetaTags() не знал.
Это в последних обновлениях появилось, после того как убрали рендер их по-умолчанию
pervozdanniy
Сообщения: 1
Зарегистрирован: 2017.11.12, 01:28

Re: Как отправить csrf token на сервер без формы ? [Решено]

Сообщение pervozdanniy »

пацаны, какие мета-теги???

Код: Выделить всё

var param = yii.getCsrfParam();
var token = yii.getCsrfToken();
Аватара пользователя
Faenir
Сообщения: 292
Зарегистрирован: 2010.01.06, 01:46
Откуда: Симферополь

Re: Как отправить csrf token на сервер без формы ? [Решено]

Сообщение Faenir »

pervozdanniy писал(а): 2017.11.12, 01:31 пацаны, какие мета-теги???

Код: Выделить всё

var param = yii.getCsrfParam();
var token = yii.getCsrfToken();
yii.js не всегда нужен на фронтенде
Ответить