我正在将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();
});
...
});
当我使用标头授权调用此/ api / test URL时:Bearer access_token我正在获得当前经过身份验证的用户。那很好。
我正在用Postman测试这些端点,但是如果我使用浏览器中的javascript测试此端点,一切都一样。
问题是当我有来自两个不同用户的两个不同的access_token时。如果我使用一个access_token调用此URL,则得到正确的用户数据作为响应,如果我等待几秒钟并使用第二个access_token调用相同的URL,则得到正确的第二用户数据作为响应。但是,如果我同时使用这两个access_token两次调用了此URL(第一次调用,例如在第二秒的调用之后调用),那么我在两个请求中都会得到第一次调用的用户数据作为响应。
希望您能理解问题所在。
这可能是缓存问题,还是会话问题(即使api是无状态的)?
如果您需要更多信息,请告诉我。
首先,我认为这是浏览器缓存问题,但在邮递员中是相同的。我还尝试过将Google Chrome浏览器用于一个请求,将Mozilla用于第二个请求,并且一切都相同。
如果您对可能出什么问题有任何想法,我将不胜感激:D
答案 0 :(得分:0)
我找到了解决方案。这不是Laravel或Passport问题。
问题是: 在我的服务器上,我们配置了Nginx和https://engintron.com/,并且该Engintron具有某种微缓存机制。
此微缓存可以完全禁用,也可以在请求中使用标头禁用(缓存控制:私有)。
微缓存正在将GET请求缓存到URL 1秒钟,并且忽略了不同的Authorization标头。这就是为什么如果我在不到1秒的时间内发出这两个请求,就会获得两个不同的Authorization标头相同的用户数据的原因。
我希望这会在将来对其他人有所帮助。如果有人需要更多信息,请随时与我联系:D