Laravel Passport 来自同一端点的响应同时来自两个用户的两个不同的 access_tokens 在两种情况下都返回第一个用户

Posted

技术标签:

【中文标题】Laravel Passport 来自同一端点的响应同时来自两个用户的两个不同的 access_tokens 在两种情况下都返回第一个用户【英文标题】:Laravel Passport response from same endpoint at same time with two different access_tokens from two users in both cases return first user 【发布时间】:2019-10-17 03:29:43 【问题描述】:

我正在使用 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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于Laravel Passport 来自同一端点的响应同时来自两个用户的两个不同的 access_tokens 在两种情况下都返回第一个用户的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Passport 无法验证我新生成的令牌

Laravel 5.5 - Laravel Passport 使用正确的授权类型?

Laravel7 Passport:尝试将请求发送到“api/user”时获取“未定义索引:aud”

Laravel 通过 Passport 实现 API 请求认证:隐式授权令牌

Laravel Passport 不支持_grant_type

使用 Passport 对 API 端点进行身份验证