如何强制 Laravel API 始终返回 JSON,没有重定向

问题描述

我有一个 Laravel 应用程序,我构建该应用程序仅用作 JSON API。它没有意见,只是为了支持我们的第一方 SPA。它使用 Laravel 8、Fortify 和 Sanctum。我的 SPA 位于 my-app.test,API 位于 api.my-app.test。 SPA 按预期工作。但是,如果我在浏览器中访问经过身份验证的 API 路由之一,例如api.my-app.test/someResource,我收到一个错误页面,告诉我“路由 [登录] 未定义。”,并且堆栈跟踪显示了以下代码

vendor/laravel/framework/src/Illuminate/Foundation/Exceptions/Handler.PHP:393

protected function unauthenticated($request,AuthenticationException $exception)
{
  return $request->expectsJson()
    ? response()->json(['message' => $exception->getMessage()],401)
    : redirect()->guest($exception->redirectTo() ?? route('login'));
}

我在以下文件中尝试覆盖 redirectTounauthenticated 方法,但它不起作用: app/Http/Middleware/Authenticate.PHP

protected function unauthenticated($request,array $guards): JsonResponse
{
  return response()->json(['message' => 'Unauthenticated.'],Response::HTTP_UNAUTHORIZED);
}

protected function redirectTo($request)
{
  return response()->json(['message' => 'Unauthenticated.'],Response::HTTP_UNAUTHORIZED);
}

当我实现上面的 unauthenticated 时,它似乎不再对我的任何路由进行身份验证,命中任何 API 端点都会返回应该受到保护的结果。当我实现上面的 redirectTo 时,我收到另一个错误消息,提示“标头可能不包含多个标头,检测到新行”,我不知道从哪里开始。

全局禁用所有视图和重定向并强制 Laravel 始终返回 JSON 的正确方法是什么?有没有办法覆盖 expectsJson

解决方法

只需处理 AuthenticationException 中的 App\Exceptions\Handler,如下所示:

public function render($request,Throwable $exception)
{
    if ($exception instanceof AuthenticationException) {
        return response()->json(["error"=>30001,"message"=>"authenticate failed"]);
    }
    return parent::render($request,$exception);
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...