Yii2 CORS 与 Auth 不适用于非 CRUD 操作

2023-11-30

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

网址管理器:

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

控制器行为:

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 和身份验证在自定义操作上协同工作?

编辑:我应该补充一点,只有当浏览器使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;
}

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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Yii2 CORS 与 Auth 不适用于非 CRUD 操作 的相关文章

随机推荐