gpt4 book ai didi

php - 带有 Auth 的 Yii2 CORS 不适用于非 CRUD 操作

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:07:56 24 4
gpt4 key购买 nike

我正在 Yii2 中构建 API,并添加了 CORS 和身份验证。这适用于所有创建/读取/更新/删除操作,但不适用于自定义操作。有没有人以前经历过这种情况?

网址管理器:

['class' => 'yii\rest\UrlRule', 'controller' => 'api/v1/user', 'pluralize' => false],

Controller 行为:

public function behaviors()
{
return ArrayHelper::merge([
'corsFilter' => [
'class' => Cors::className(),
],
[
'class' => HttpBearerAuth::className(),
'except' => ['options',
'login',
],
],
], parent::behaviors()
);
}

如前所述,CRUD 操作很好,但自定义操作(例如 http://domain.com/user/test)将以 401 Unauthorised 响应进行响应。

难道不能让 CORS 和 auth 一起处理自定义操作吗?

编辑:我应该补充一点,问题 (401) 仅在浏览器发出 OPTIONS 请求时发生。正常请求(curl、Postman)不受影响。 RESTful、Cors、Auth 组合似乎会出现此问题。

最佳答案

试试这个:

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;
}

它将取消设置parent controller 实现的默认 authenticator确保首先处理 cors。然后我们强制 cors 在实现您自己的 authenticator 之前允许凭据。


可能引发未授权错误的另一件事是未找到或错误的Options响应,因为浏览器首先请求它获取允许的动词列表。您可以在浏览器的网络选项卡中的 header 响应中查看该列表。

一般规则是,当您要求浏览器对任何 url 执行 PUT、DELETE 或 POST 等明智的动词时,它可能会首先向同一 url 发送一个 OPTIONS 请求> (check this ) 在发送真实请求之前检查该动词是否被允许。所以 Yii 应该配置为通过执行正确的重定向来响应所有这些 OPTIONS 动词。

ActiveController 实现的默认 CRUD 操作正在使用那些 default patterns :

'PUT,PATCH {id}' => 'update',
'DELETE {id}' => 'delete',
'GET,HEAD {id}' => 'view',
'POST' => 'create',
'GET,HEAD' => 'index',
'{id}' => 'options',
'' => 'options',

因此,无论您在 urlManager['rules'] 中实现什么配置,请确保不要覆盖其中的最后两个,如果您使用自定义模式,请始终记住包含其等效的 选项 这个例子中的动词:

[
'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',
]
],

这同样适用于在 extraPatterns 中添加自定义模式。


Options 操作默认在 ActiveController 中实现。可以看到它的代码here .如果你正在扩展一个不同于 ActiveController 的 Controller ,比如 \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;
}

关于php - 带有 Auth 的 Yii2 CORS 不适用于非 CRUD 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36274089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com