【问题标题】:Laravel REST API - infinite loopLaravel REST API - 无限循环
【发布时间】: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方法吗?
  • 你在本地使用这个应用吗?

标签: php laravel rest authentication oauth


【解决方案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”这样的虚拟主机后解决错误

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 2014-12-21
      • 2020-03-02
      • 2018-11-21
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多