понедельник, 29 августа 2016 г.

Кроссдоменные куки с помощью AJAX

Кроссдоменные куки можно установить с помощью AJAX-запроса.

Для этого используем CORS.

Пример для Yii2:

<?php

namespace frontend\controllers;

use yii\web\Response;
use Yii;
use app\components\MyUtility;
use yii\web\Controller;

class CoolController extends Controller
{
    // Отключаем CSRF для контроллера.
    // Кроссдоменный запрос работает только без CSRF.
    public $enableCsrfValidation = false;

    public function behaviors()
    {
        // Включаем CORS для контроллера.
        return [
            'corsFilter' => [
                'class' => \yii\filters\Cors::className(),
                'cors' => [
                    // Разрешаем доступ с указанных доменов.
                    'Origin' => ['http://site1.com', 'http://site2.com'],
                    'Access-Control-Allow-Origin' => true,
                    // Куки от кроссдоменного запроса
                    // будут установлены браузером только при заголовке
                    // "Access-Control-Allow-Credentials".
                    'Access-Control-Allow-Credentials' => true,
                    // Разрешаем только метод POST.
                    'Access-Control-Request-Method' => ['POST'],
                ],
            ],
        ];
    }

    public function actionSelect()
    {
        Yii::$app->response->format = Response::FORMAT_JSON;
        return MyUtility::processPostParamsAndSetCookie(Yii::$app->request->post());
    }
}

Код JQuery:

$.ajax('http://site.com/set-global-cookie', {
    type : 'POST',
    data : {veryImportantData: someInformation},
    success : function (response) {
        if (response.status !== 'success') {
            if (response.status === 'error') {
                console.error('Возникла ошибка: ' + response.message);
            } else {
                console.error('Возникла неизвестная ошибка.');
            }
        }
    },
    error :  function(xhr, str){
        console.error('Возникла ошибка AJAX: ' + xhr.responseCode + ', "' + str + '"');
    },
    xhrFields: {
        // Необходимо для установки куков.
        withCredentials: true
    },
});

2 комментария:

  1. Просто огромное спасибо! Я перерыл кучу форумов и мануалов за сегодня и нигде не мог найти решение. Смог настроить кроссдоменную авторизацию, но не знал как передать cookie. Параметр withCredentials просто спас меня,

    ОтветитьУдалить