Laravel REST API - 无限循环

时间:2017-10-09 03:21:19

标签: php laravel rest authentication oauth

我正在使用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”拨打电话,我会获得成功的退出响应。
  • 如果我根本没有提供标题,我会收到“未经过身份验证”的消息(这很好)
  • 但是,如果我为头文件提供了一个被撤销的令牌,我会得到一个函数的递归deadloop: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未能弄清楚它已被撤销。

任何建议表示赞赏,

2 个答案:

答案 0 :(得分: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,
    ];
}

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

答案 1 :(得分:0)

我在localhost遇到了这个问题。就我而言,我已经使用过xampp服务器并面临此问题 创建像“ testlarave.test”这样的虚拟主机后,解决错误