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 - 无限循环的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 邮件队列无限循环异常

部署后laravel登录无限循环

自定义 Spring Security 应用程序中的无限循环

REST API:GUI 中的无限滚动分页,但允许搜索所有条目

laravel Job / Queue未被处理奇怪的无限循环

从 api 获取时反应 useEffect 无限循环