REST и CORS

Всё что касается построения API
Ответить
johnluxor
Сообщения: 82
Зарегистрирован: 2010.09.10, 19:39

REST и CORS

Сообщение johnluxor »

Добрый день.

Сегодня помучался с вопросом, почему поведение yii\filters\Cors не отправляет заголовки CORS.

И тут я выяснил вот, что:

Есть в этом поведении такая функция, которая переделывает из заголовка в ключи массива $_SERVER

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

 /**
     * Convert any string (including php headers with HTTP prefix) to header format like :
     *  * X-Pingother -> HTTP_X_PINGOTHER
     *  * X PINGOTHER -> HTTP_X_PINGOTHER
     * @param string $string string to convert
     * @return string the result in "php $_SERVER header" format
     */
    protected function headerizeToPhp($string)
    {
        return 'HTTP_' . strtoupper(str_replace([' ', '-'], ['_', '_'], $string));
    }
 
К примеру, ключ Origin переделывает в HTTP_ORIGIN и далее когда подготавливается отправка заголовка, то проверяется есть ли значение у $_SERVER['HTTP_ORIGIN']
Но такого значения нет в этой переменной и соответственно заголовок не отправляется.

Собственно вопрос, это почему так? Или что я делаю не так, откуда в $_SERVER должны появиться эти ключи?
Аватара пользователя
r3verser
Сообщения: 195
Зарегистрирован: 2012.04.01, 17:29
Откуда: Киев

Re: REST и CORS

Сообщение r3verser »

Заголовок origin шлет клиент, поэтому он попадает в $_SERVER.
johnluxor
Сообщения: 82
Зарегистрирован: 2010.09.10, 19:39

Re: REST и CORS

Сообщение johnluxor »

То есть получается в запросе клиент должен отправить все заголовки:

HTTP_ORIGIN
HTTP_ACCESS_CONTROL_REQUEST_METHOD
HTTP_ACCESS_CONTROL_REQUEST_HEADERS
HTTP_ACCESS_CONTROL_ALLOW_CREDENTIALS
HTTP_ACCESS_CONTROL_MAX_AGE
Аватара пользователя
r3verser
Сообщения: 195
Зарегистрирован: 2012.04.01, 17:29
Откуда: Киев

Re: REST и CORS

Сообщение r3verser »

Клиент, например браузер, сам добавит хедер origin если запрос будет кроссдоменный. Расскажи как ты и куда отправляешь запрос и кодес покажи клиентский и серверный.
johnluxor
Сообщения: 82
Зарегистрирован: 2010.09.10, 19:39

Re: REST и CORS

Сообщение johnluxor »

Клиентский элементарный

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

<script>
    window.onload = function () {
        $(function () {
            $.get('http://api.url', function (data) {
                console.log(data);
            });
        });
    };
</script>
В серверном просто поведение установлено, и подключен стандартный Контролер, наследованный от ActiveController

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

public function behaviors()
    {
        $behaviors = parent::behaviors();
        $behaviors['authenticator'] = [
            'class' => HeaderParamAuth::className(),
        ];

        $behaviors[] = [
            'class' => Cors::className()
        ];

              return $behaviors;
    }
Аватара пользователя
r3verser
Сообщения: 195
Зарегистрирован: 2012.04.01, 17:29
Откуда: Киев

Re: REST и CORS

Сообщение r3verser »

В behaviors вместо

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

$behaviors[] = [
            'class' => Cors::className()
        ];
напиши

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

$behaviors['corsFilter'] = [
            'class' => \yii\filters\Cors::className()
        ];
johnluxor
Сообщения: 82
Зарегистрирован: 2010.09.10, 19:39

Re: REST и CORS

Сообщение johnluxor »

Ничего не меняет. Перед класом используется use. Поведение работает, то есть проверка проходит, но не находит перечисленных мной выше ключей в массиве $_SERVER. Он проверяет их всех, и получается мне нужно передавать от клиента их всех? как то странно, по моему
Аватара пользователя
r3verser
Сообщения: 195
Зарегистрирован: 2012.04.01, 17:29
Откуда: Киев

Re: REST и CORS

Сообщение r3verser »

тут не в use дело а вместо
$behaviors[] = ... сделать $behaviors['corsFilter'] = ...
johnluxor
Сообщения: 82
Зарегистрирован: 2010.09.10, 19:39

Re: REST и CORS

Сообщение johnluxor »

Так тоже пробовал, не помогает.

Само поведение срабатывает и делает проверку, но ждет что в $_SERVER будут параметры

HTTP_ORIGIN
HTTP_ACCESS_CONTROL_REQUEST_METHOD
HTTP_ACCESS_CONTROL_REQUEST_HEADERS
HTTP_ACCESS_CONTROL_ALLOW_CREDENTIALS
HTTP_ACCESS_CONTROL_MAX_AGE

Но их нет, их все должен передавать клиент?
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: REST и CORS

Сообщение astronin »

у вас случайно не nginx стоит?
johnluxor
Сообщения: 82
Зарегистрирован: 2010.09.10, 19:39

Re: REST и CORS

Сообщение johnluxor »

Именно он, есть особенности?
Аватара пользователя
r3verser
Сообщения: 195
Зарегистрирован: 2012.04.01, 17:29
Откуда: Киев

Re: REST и CORS

Сообщение r3verser »

теперь понятно, погугли nginx cross origin header
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: REST и CORS

Сообщение astronin »

есть, его надо настроить для CORS
https://gist.github.com/michiel/1064640
johnluxor
Сообщения: 82
Зарегистрирован: 2010.09.10, 19:39

Re: REST и CORS

Сообщение johnluxor »

К сожелению жоступа к конфигу не имею. Пришлось реализовать просто вручную отправлять заголовоки
Ответить