首页 文章

Laravel REST API - 无限循环

提问于
浏览
3

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

  • 如果我使用 Headers "Authorization => Bearer TOKEN"进行调用,我会获得成功的注销响应 .

  • 如果我没有提供任何 Headers ,我会收到"not authenticated"消息(这很好)

  • 但是,如果我提供带有撤销令牌的标头,我会得到函数的递归死循环: Illuminate\Auth\RequestGuard->user() (它一直递归调用自身,直到堆栈溢出)

这都是在 auth:api 中间件中完成的,我的注销代码没有到达,但我的LoginController构造函数 is 被调用 . 构造函数代码:

public function __construct(Application $app)
    {
        $this->apiConsumer = $app->make('apiconsumer');

        $this->middleware('guest')
             ->except('logout');
    }

我很难理解这是我的代码导致这个问题,还是Laravel护照auth的某种组合 .

我的第一个想法是auth:api中间件无法验证用户,因此将用户重定向到/ home,由于某种原因,它会再次以递归方式触发 . 但如果是这种情况,为什么没有 Headers 它能正常工作?

我目前的想法是,数据库中存在有问题的令牌 does ,但是Laravel未能弄清楚它已被撤销 .

任何建议赞赏,

1 回答

  • 0

    经过大量研究后,我找到了答案(如果不是答案) . 看来这是一个Laravel bug(https://github.com/laravel/passport/issues/440) . 解决方案是将OAuthServerException添加到app / Exceptions / Handler.php中的$ dontReport数组:

    class Handler extends ExceptionHandler
    {
        protected $dontReport = [
           ...
            \League\OAuth2\Server\Exception\OAuthServerException::class,
        ];
    }
    

    这将避免尝试记录用户信息,从而避免死循环 .

相关问题