尝试这个:
public function behaviors()
{
$behaviors = parent::behaviors();
unset($behaviors['authenticator']);
$behaviors['corsFilter'] = [
'class' => Cors::className(),
'cors' => [
'Origin' => ['*'],
'Access-Control-Request-Method' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
'Access-Control-Request-Headers' => ['*'],
'Access-Control-Allow-Credentials' => true,
],
];
$behaviors['authenticator'] = [
'class' => HttpBearerAuth::className(),
'except' => ['options','login'],
];
return $behaviors;
}
It will unset默认值authenticator
由执行父控制器确定cors
首先被治疗。然后我们强制cors
在实施您自己的之前允许凭据authenticator
.
另一件可能引起这个问题的事情未经授权错误是未找到或错误Options
作为浏览器请求的响应,它首先获取允许的动词列表。您可以在浏览器的网络选项卡中的标头响应中检查该列表。
一般规则是当您要求浏览器执行诸如 PUT、DELETE 或 POST 之类的明智动词时url它可能首先向同一对象发送一个 OPTIONS 请求url (check this)在发送真正的请求之前检查该动词是否被允许。因此,Yii 应该配置为通过执行正确的重定向来响应所有这些 OPTIONS 动词。
默认的 CRUD 操作由ActiveController
正在使用那些默认模式:
'PUT,PATCH {id}' => 'update',
'DELETE {id}' => 'delete',
'GET,HEAD {id}' => 'view',
'POST' => 'create',
'GET,HEAD' => 'index',
'{id}' => 'options',
'' => 'options',
所以无论你执行什么配置urlManager['rules']
确保不要覆盖其中的最后两个,如果您使用自定义模式,请务必记住包含其等效项options
像这个例子中的动词:
[
'class' => 'yii\rest\UrlRule',
'controller' => ['account' => 'auth/account'],
'patterns' => [
'POST,HEAD login' => 'login',
'POST,HEAD signup' => 'signup',
'POST req-reset-pass' => 'request-password-reset',
'POST reset-pass' => 'reset-password',
// OPTTIONS VERBS
'OPTIONS login' => 'options',
'OPTIONS signup' => 'options',
'OPTIONS req-reset-pass' => 'options',
'OPTIONS reset-pass' => 'options',
]
],
在其中添加自定义模式时也是如此额外模式.
The Options
默认情况下执行操作ActiveController
。可以看到它的代码here。
如果您扩展的控制器与ActiveController
也许就像\yii\rest\Controller
请务必手动包含它:
public function actions()
{
$actions = parent::actions();
$actions['options'] = [
'class' => 'yii\rest\OptionsAction',
// optional:
'collectionOptions' => ['GET', 'POST', 'HEAD', 'OPTIONS'],
'resourceOptions' => ['GET', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'],
];
return $actions;
}