首页 > 解决方案 > Laravel Passport 来自同一端点的响应同时来自两个用户的两个不同的 access_tokens 在两种情况下都返回第一个用户

问题描述

我正在使用 Laravel 5.8 和 Passport 7.2 为我的应用程序构建 API。我正在使用 password_grant 进行身份验证。

我已经创建了从注册到登录的所有内容,并且一切似乎都正常运行。我能够获取 access_token 和 refresh_token 并访问附加了中间件 auth:api 的路由。

在我的路线中,我有这个:

Route::group(['middleware' => ['auth:api']], function () {
...
    Route::get('test', function (Request $request) {
        return $request->user(); 
    });
...
});

当我使用标头 Authorization: Bearer access_token 调用此 /api/test URL 时,我正在获取当前经过身份验证的用户。这很好用。

我正在使用 Postman 测试这些端点,但是如果我使用浏览器中的 javascript 进行测试,一切都是一样的。

问题是当我有来自两个不同用户的两个不同 access_token 时。如果我用一个 access_token 调用这个 URL,我会得到正确的用户数据作为响应,如果我等待几秒钟并用第二个 access_token 调用相同的 URL,我会得到正确的第二个用户数据作为响应。但是,如果我同时使用这两个 access_tokens 调用此 URL 两次(首先调用,例如在第二次调用半秒后),我将首先调用用户数据作为两个请求的响应。

我希望你能明白什么是问题。

这可能是缓存问题,还是会话问题(即使 api 是无状态的)?

如果您需要更多信息,请告诉我。

首先我认为这是浏览器缓存问题,但在邮递员中也是如此。我还尝试使用 Google Chrome 处理一个请求,使用 Mozilla 处理第二个请求,一切都一样。

如果您对可能出现的问题有任何想法,我将不胜感激:D

标签: laravelapilaravel-passport

解决方案


我找到了解决方案。这不是 Laravel 或 Passport 的问题。

问题是:在我的服务器上,我们配置了 Nginx 和https://engintron.com/,并且这个 Engintron 有一些微缓存机制。

此微缓存可以完全禁用,也可以通过请求中的标头禁用(缓存控制:私有)。

微缓存将 GET 请求缓存到 URL 1 秒,并忽略不同的授权标头。这就是为什么如果我在 1 秒内发出这两个请求,我会为两个不同的 Authorization 标头获得相同的用户数据。

我希望这将在未来对其他人有所帮助。如果有人需要更多信息,请随时与我联系:D


推荐阅读