我正在使用Laravel 9,扩展Laravel Breeze进行身份验证。 我有受身份验证中间件 (AppHttpMiddlewareAuthenticate.php
) 保护的路由,其中我指定redirectTo()
应该返回route('auth.login')
。 这一直很好,直到几天前突然全部停止了!大约在同一时间,我引入了Laravel Sanctum用于API身份验证。
如果未登录,并且您尝试访问受保护的路由,则会弹出以下 500 错误:
尝试在
vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php
:191 处读取布尔值上的属性"标头">
我尝试调试它,发现问题出在 Laravel 主Authenticate.php
类的unauthenticated()
方法中。重定向未正确发生。当我在应用程序的Authenticate.php
中扩展此类时,我意识到以下内容有效,并且出现 404 错误:
protected function unauthenticated($request, array $guards)
{
abort(404);
}
但是,如果我执行以下操作,我将返回到上述链接中详述的原始错误:
protected function unauthenticated($request, array $guards)
{
return redirect(route('auth.login'));
}
我无法解释为什么会这样。如果我回显重定向,它也有点工作,但这是一个黑客。
有人,请帮忙解释一下发生了什么。
经过更多调试,我发现问题确实出在Authenticate
中间件上,特别是在unauthenticated()
方法中。 这会抛出AuthenticationException
而又被我添加的自定义处理程序劫持,该处理程序是我引入的 Laravel sanctum 的一部分,但忘记了用于 API 身份验证。
此处理程序的目的是在 API 请求未通过身份验证时覆盖默认的 Laravel 错误消息。
在那里,我检查请求是否针对/api
路由,然后返回自定义错误消息。但是,如果不是,我会true
返回.这是罪魁祸首。
$this->renderable(function (AuthenticationException $e, $request) {
if ($request->is('api/*')) {
return response()->json(['error' => 'Not authorised.'], 401);
}
return true; //Bad
});
正确的方法(当我希望Laravel处理任何其他请求时)是简单地不返回任何内容。 文档说:
如果提供给可渲染方法的闭包没有返回值,则将使用 Laravel 的默认异常渲染