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 5.5 - Laravel Passport 使用正确的授权类型?
Laravel7 Passport:尝试将请求发送到“api/user”时获取“未定义索引:aud”
Laravel 通过 Passport 实现 API 请求认证:隐式授权令牌