Laravel REST API - 无限循环
Posted
技术标签:
【中文标题】Laravel REST API - 无限循环【英文标题】:Laravel REST API - infinite loop 【发布时间】:2018-03-20 04:28:25 【问题描述】:我正在使用 Laravel 5.5 + Passport 构建一个 REST 用户微服务。 我使用的是标准 Passport::routes(),但我必须修改 Auth::routes 以使它们返回 JSON 响应,并使其与 Passport 一起使用。
我在 routes/web.php 文件中添加了以下几行:
Route::group(['middleware' => 'auth:api'], function ()
$this->post('logout', 'Auth\LoginController@logout')->name('logout');
);
这让我可以发布https://myapi/logout
如果我使用标题“Authorization => Bearer TOKEN”进行调用,我会收到成功的注销响应。 如果我根本不提供标头,我会收到“未通过身份验证”消息(这很好) 但是,如果我向标头提供已撤销的令牌,我会得到函数的递归死循环:Illuminate\Auth\RequestGuard->user()
(它会一直递归调用自身,直到堆栈溢出)
这都是在auth:api
中间件中完成的,我的注销代码没有到达,但是我的 LoginController 构造函数被调用了。构造函数代码:
public function __construct(Application $app)
$this->apiConsumer = $app->make('apiconsumer');
$this->middleware('guest')
->except('logout');
我很难理解是我的代码导致了这个问题,还是 Laravel + passport + auth 的某种组合。
我的第一个想法是 auth:api 中间件无法对用户进行身份验证,结果将用户重定向到 /home,由于某种原因,它再次被递归触发。但如果是这样的话,为什么它会在没有标题的情况下正常工作?
我目前的想法是,有问题的令牌确实存在于数据库中,但 Laravel 无法确定它已被撤销。
任何建议表示赞赏,
【问题讨论】:
您是否尝试过删除注销路由并按照AuthServiceProvider.php
中的文档中所述在boot()
方法中键入Passport::routes();
来注册passport
路由?
我没有,那我要手动重新实现auth logout方法吗?
你在本地使用这个应用吗?
【参考方案1】:
经过大量研究,我找到了答案(如果不是 答案)。看来这是一个 Laravel 错误 (https://github.com/laravel/passport/issues/440)。解决方法是在app/Exceptions/Handler.php中的$dontReport数组中添加OAuthServerException:
class Handler extends ExceptionHandler
protected $dontReport = [
...
\League\OAuth2\Server\Exception\OAuthServerException::class,
];
这将避免尝试记录用户信息,从而避免死循环。
【讨论】:
【参考方案2】:我在 localhost 中遇到过这个问题。就我而言,我使用过 xampp 服务器并面临这个问题 创建像“testlarave.test”这样的虚拟主机后解决错误
【讨论】:
以上是关于Laravel REST API - 无限循环的主要内容,如果未能解决你的问题,请参考以下文章
自定义 Spring Security 应用程序中的无限循环
REST API:GUI 中的无限滚动分页,但允许搜索所有条目