带有授权标头的 GET 请求之前的 OPTIONS 请求在苗条框架 4 中不起作用

Posted

技术标签:

【中文标题】带有授权标头的 GET 请求之前的 OPTIONS 请求在苗条框架 4 中不起作用【英文标题】:OPTIONS request before GET request with Authorization Header not working in slim framework 4 【发布时间】:2020-03-22 08:55:48 【问题描述】:

我已经克隆了已经实现了 CORS 的苗条骨架 (https://github.com/slimphp/Slim-Skeleton)。 但是仍然当 API 在 GET 之前调用 OPTIONS 时,它会发送 405 ERROR "Method not allowed. Must be one of: GET"

这是我遇到此错误的路线。 $group->get('/users', ListUsersAction::class);

    $app->group('', function (Group $group) 
        $group->post('/user/create', CreateUsersAction::class);
        $group->get('/users', ListUsersAction::class);
        $group->get('/user/id', ViewUserAction::class);
    )->add(AuthenticationMiddleware::class);

邮递员正在使用相同的路线。如果我从标头中删除授权令牌,则相同的路线正在工作。

执行甚至没有到达“AuthenticationMiddleware”的第一行。

但是我通过添加没有“AuthenticationMiddleware”的相同选项路由来测试它。

像这样:

    $app->options('/users', function(Request $request, Response $response) return $response;);

    $app->group('', function (Group $group) 
        $group->post('/user/create', CreateUsersAction::class);
        $group->get('/users', ListUsersAction::class);
        $group->get('/user/id', ViewUserAction::class);
    )->add(AuthenticationMiddleware::class);

这是有效的。所以我想我忘了添加一些代码,或者我做了任何导致错误的错误,或者骨架有错误。

有人可以帮忙吗? 提前致谢。

【问题讨论】:

这是文档和骨架中的一个已知“错误”。更好地为 CORS 预检请求使用显式 options() 路由。 Example @odan 感谢您抽出宝贵时间发表评论并参与该问题。以下是我找到的答案(通配符OPTIONS 路线)。 -- 与您的建议类似。 【参考方案1】:

好的,我找到了解决方案。

您可以使用通配符 OPTIONS 请求来避免此问题/错误。 下面是一个例子:

$app->options('/routes:.+', function ($request, $response, $args) 
    return $response;
);

我已经对其进行了测试,目前对我来说工作正常。


如前所述,在我的测试中,我通过为/users 创建OPTIONS 路由进行了尝试,它正在工作,但是为所有创建的API 路由创建OPTINOS 路由没有意义,这是解决方案作为通配符OPTIONS 路由。

感谢@odan 抽出时间发表评论,但通配符OPTIONS 路由是更好的解决方案。

【讨论】:

欢迎您。您是否也尝试过请求不存在的路由和存在路由但不存在特定 http 方法的请求? 根据howtodoinjava.com/spring-restful/http-options-request-handler HTTP OPTIONS 方法用于描述目标资源的通信选项。此方法允许客户端确定与资源相关联的选项和/或要求,或服务器的能力,而无需暗示资源操作或启动资源检索。因此,将选项作为通配符不会影响任何安全性。如果您在任何不存在的路线上请求,它通常会向您发送 404。【参考方案2】:

我刚刚添加了所有路线的选项,我想在哪里使用:

示例如果我在 /api/user 路由中使用它,那么我添加此代码:

$app->options('/api/user', function ($request, $response, $args) 
    return $response;
);

【讨论】:

以上是关于带有授权标头的 GET 请求之前的 OPTIONS 请求在苗条框架 4 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用授权标头发出 GET CORS 请求

React - 带有标头的 ajax GET 请求仍返回 401(未经授权)

CORS,防止带有授权标头的请求预检

带有授权标头的离子 http 请求

无法使用授权标头执行发布请求

在 React-Native 应用程序中使用带有授权标头的 Axios GET