1

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

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'));
}

我有以下文件,我试图覆盖redirectToandunauthenticated方法,但它不起作用: 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

4

2 回答 2

3

只需处理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);
}
于 2021-08-09T06:21:18.033 回答
0

您还可以覆盖以下unauthenticated功能app/Exceptions/Handler.php

protected function unauthenticated($request, AuthenticationException $exception)
{
    return response()->json(['message' => $exception->getMessage()], 401);
}
于 2022-02-08T22:43:53.387 回答