yii2 restful api: (причина: отсутствует заголовок CORS 'Access-Control-Allow-Origin') - PullRequest
0 голосов
/ 17 декабря 2018

Я хочу использовать React с Yii2 RESTful, я создал пользовательский контроллер следующим образом:

<?php
namespace app\controllers;
use yii\rest\ActiveController;

class UsersController extends ActiveController
{
    public $modelClass = 'app\models\User';
}

когда открытая ссылка в браузере показывает моих пользователей, когда я хочу использовать axios в реакции, я получаю ошибкуя консоль браузера:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost/rest/web/users. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

, но когда я проверяю network в инструментах разработчика Firefox, я нахожу запрос axios и его статус в 200 и получает ответ правильно.

я пытаюсь использовать behaviors функция в моих контроллерах, например:

public function behaviors()
{
    return [
        'corsFilter' => [
            'class' => \yii\filters\Cors::className(),
            'cors' => [
                'Origin' => ['*'],
                'Access-Control-Request-Method' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
                'Access-Control-Request-Headers' => ['*'],
            ],

        ],
    ];
}

но получаю ошибку

Неверный аргумент - yii \ base \ InvalidArgumentException Содержимое ответа не должно быть массивом.

как я могу это исправить?

1 Ответ

0 голосов
/ 17 декабря 2018

Обновление

Обновлен ответ, поскольку реализованная логика позволяла каждому запросу обходить фильтры аутентификации ( Благодаря @KalyanHalderRaaz за указаниеошибка ).

Есть две вещи, которые нужно изменить

  • При повторном добавлении фильтров лучше указать, какой тип аутентификации вы используете.измените код ниже

    // re-add authentication filter
    $behaviors['authenticator'] = $auth;
    

    на следующий, я использую, например, BasicAuth.

    $behaviors['authenticator'] = [
        'class' => yii\filters\auth\HttpBasicAuth::class
    ];
    
  • При добавлении beforeAction() не забудьтеоберните логику в if(parent::beforeAction($action)), иначе он будет аутентифицировать каждый запрос, поскольку мы просто возвращаем true для каждого запроса здесь, а также не вызываем родителя, который вызовет фильтры.

    Замените beforeAction() следующим

    public function beforeAction($action)
    {
        if (parent::beforeAction($action)) {
            \Yii::$app->response->format = Response::FORMAT_JSON;
            return true;
        }
    
    }
    

Просто убедитесь, что вы переопределяете findIdentityByAccessToken() в модели идентификации пользователя


В соответствии с документами вы должны сначала сбросить фильтр authenticator, чтобы добавить фильтр Cors, чтобы ваше поведение выглядело как

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

    // remove authentication filter necessary because we need to 
    // add CORS filter and it should be added after the CORS
    unset($behaviors['authenticator']);

    // add CORS filter
    $behaviors['corsFilter'] = [
        'class' => '\yii\filters\Cors',
        'cors' => [
            'Origin' => ['*'],
            'Access-Control-Request-Method' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
            'Access-Control-Request-Headers' => ['*'],
        ],
    ];

    // re-add authentication filter of your choce
    $behaviors['authenticator'] = [
        'class' => yii\filters\auth\HttpBasicAuth::class
    ];

    // avoid authentication on CORS-pre-flight requests (HTTP OPTIONS method)
    $behaviors['authenticator']['except'] = ['options'];
    return $behaviors;
}

И вы можете установитьформат ответа для json внутри вашего контроллера, добавив beforeAction, как показано ниже

public function beforeAction($action)
{
    if (parent::beforeAction($action)) {
        \Yii::$app->response->format = Response::FORMAT_JSON;
        return true;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...