laravel - 如何强制 Laravel API 始终返回 JSON,不重定向

标签 laravel laravel-8 laravel-authentication laravel-sanctum laravel-fortify

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

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 时,我收到另一个错误,提示“ header 可能不包含多个 header ,检测到新行”,并且我不确定从哪里开始。

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

最佳答案

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

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

关于laravel - 如何强制 Laravel API 始终返回 JSON,不重定向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66449271/

相关文章:

javascript - 如何使用(Promise all)渲染 api 的响应

laravel - 登录后出现太多重定向错误

Laravel 验证长数字

javascript - Vue.js 组件中未定义 props

laravel - Composer 错误在 Windows 10 中安装 laravel/installer

javascript - 如何在 Laravel 8 中使用 JavaScript 获取?

php - Laravel 8 中的自定义 DatabaseSessionHandler

Laravel 策略始终返回 403 未经授权

php - 在默认用户表中更改 laravel 5.6 中的电子邮件列名称

mysql - laravel 中带有 join 的子查询