【发布时间】: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