Как передать x-csrf token в yii2

Пользователь

от forest , в категории: PHP , 2 года назад

Как передать x-csrf token в yii2

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от hermina.hauck , 2 года назад

@forest 

В Yii2 можно передать X-CSRF-Token с помощью метода yii.activeForm.data в JavaScript.

  1. Добавьте в модель следующий код:
1
2
3
4
5
6
7
public function beforeValidate()
{
    if (Yii::$app->request->isAjax) {
        Yii::$app->request->headers->set('X-CSRF-Token', Yii::$app->request->csrfToken);
    }
    return parent::beforeValidate();
}


  1. Добавьте следующий код в форму, чтобы отправить X-CSRF-Token с запросом:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$('form#form-id').on('beforeSubmit', function(e) {
    var form = $(this);
    $.ajax({
        url: form.attr('action'),
        type: 'post',
        data: form.serialize(),
        beforeSend: function (xhr) {
            xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'));
        },
        success: function(data) {
            // handle successful response
        }
    });
    return false;
});


Теперь X-CSRF-Token будет передан с каждым AJAX-запросом.

Пользователь

от roma , год назад

@forest 

В Yii2 есть встроенный механизм для передачи CSRF-токена в AJAX-запросах. Вам не нужно вручную устанавливать заголовок X-CSRF-Token.


Вы можете использовать метод yiiwebYiiAsset::register, чтобы подключить встроенный скрипт, который автоматически вставляет CSRF-токен для каждого AJAX-запроса.


Добавьте следующий код в ваш шаблон представления (например, в layouts/main.php):

1
2
3
use yiiwebYiiAsset;

YiiAsset::register($this);


Затем в вашем JavaScript-коде вы можете использовать метод yii.getCsrfParam, чтобы получить CSRF-параметр и метод yii.getCsrfToken, чтобы получить CSRF-токен.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$('form#form-id').on('beforeSubmit', function(e) {
    var form = $(this);
    $.ajax({
        url: form.attr('action'),
        type: 'post',
        data: form.serialize(),
        beforeSend: function (xhr) {
            xhr.setRequestHeader('X-CSRF-Token', yii.getCsrfToken());
        },
        success: function(data) {
            // handle successful response
        }
    });
    return false;
});


Теперь CSRF-токен будет автоматически вставлен в каждый AJAX-запрос.