авторизация CORS

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
svisch
Сообщения: 19
Зарегистрирован: 2019.12.23, 11:07

авторизация CORS

Сообщение svisch »

Здравствуйте. Есть backend на yii2 и front на vue.
Когда Vue запускаешь в режиме "npm run serve", (он при этом начинает работать с порта 8080 в время, как yii2 остается на другом порту) появляется ошибка CORS. Для обычных запросов get я победил добавлением в beheviors() настроек для CORS, но не могу победить авторизацию на сайте. Подскажите плиз куда копать?
Вот ошибка в консоли при попытке авторизации:

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

Access to XMLHttpRequest at 'http://localhost:8000/login' from origin 'http://localhost:8080' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
xhr.js:160 POST http://localhost:8000/login net::ERR_FAILED
marsden
Сообщения: 23
Зарегистрирован: 2019.11.25, 09:28

Re: авторизация CORS

Сообщение marsden »

ну так надо настроить не только для GET, а для остальных тоже

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

    public function behaviors()
    {
        $behaviors = parent::behaviors();
        
...

        $behaviors['corsFilter'] = [
            'class' => \yii\filters\Cors::class,
            'cors' => [
                'Origin' => ['*'],
                'Access-Control-Allow-Origin' => ['*'],
                'Access-Control-Request-Method' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
                'Access-Control-Allow-Credentials' => null,
                'Access-Control-Allow-Headers' => [
                    'Access-Control-Allow-Headers',
                    'Origin',
                    'Accept',
                    'X-Requested-With',
                    'Content-Type',
                    'Access-Control-Request-Method',
                    'Access-Control-Request-Headers',
                    'Authorization',
                    'Refresh-Token',
                ],
            ],

        ];
        return $behaviors;
    }

    public function actions()
    {
        return [
            'options' => [
                'class' => 'yii\rest\OptionsAction',
            ],
        ];
    }
В контроллере просто прописать все варианты и все. Я сделал один контроллер -наследник от yii\rest\Controller и уже от него создаю рабочие контроллеры, так что все они сразу имеют CORS
бездумный копипаст приводит к безумным результатам
svisch
Сообщения: 19
Зарегистрирован: 2019.12.23, 11:07

Re: авторизация CORS

Сообщение svisch »

marsden писал(а): 2020.05.26, 07:59 ну так надо настроить не только для GET, а для остальных тоже

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

    public function behaviors()
    {
        $behaviors = parent::behaviors();
        
...

        $behaviors['corsFilter'] = [
            'class' => \yii\filters\Cors::class,
            'cors' => [
                'Origin' => ['*'],
                'Access-Control-Allow-Origin' => ['*'],
                'Access-Control-Request-Method' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
                'Access-Control-Allow-Credentials' => null,
                'Access-Control-Allow-Headers' => [
                    'Access-Control-Allow-Headers',
                    'Origin',
                    'Accept',
                    'X-Requested-With',
                    'Content-Type',
                    'Access-Control-Request-Method',
                    'Access-Control-Request-Headers',
                    'Authorization',
                    'Refresh-Token',
                ],
            ],

        ];
        return $behaviors;
    }

    public function actions()
    {
        return [
            'options' => [
                'class' => 'yii\rest\OptionsAction',
            ],
        ];
    }
В контроллере просто прописать все варианты и все. Я сделал один контроллер -наследник от yii\rest\Controller и уже от него создаю рабочие контроллеры, так что все они сразу имеют CORS
Да я так делал уже, не помогло. Только 'Access-Control-Allow-Headers' => ['*'] указывал.
Если кому то поможет решил проблему добавлением в index.php строк:

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

// Allow from any origin
if (isset($_SERVER['HTTP_ORIGIN'])) {
    // should do a check here to match $_SERVER['HTTP_ORIGIN'] to a
    // whitelist of safe domains
    header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}");
    header('Access-Control-Allow-Credentials: true');
    header('Access-Control-Max-Age: 86400');    // cache for 1 day
}
// Access-Control headers are received during OPTIONS requests
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD']))
        header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");

    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
        header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}");

}
marsden
Сообщения: 23
Зарегистрирован: 2019.11.25, 09:28

Re: авторизация CORS

Сообщение marsden »

точно, про index.php я забыл, там у меня одна строка только добавлена
header('Access-Control-Allow-Origin: *');
бездумный копипаст приводит к безумным результатам
Ответить