3

我正在使用 sanctum 创建 API,并且工作正常我可以列出用户、更新、存储等。

我添加了中间件 auth:sanctum 和传递令牌,并添加了中间件 EnsureFrontendRequestsAreStateful,如文档中所述。

使用无效令牌不起作用,我被重定向到登录。

但是,当验证失败时会发生问题,我正在使用表单请求,但即使在控制器验证中,当失败时我会重定向到家。

我正在使用 Postman 测试 API,如果我禁用“自动跟随重定向”,我可以看到 setTargetUrl 使用的用于重定向的 html 页面,这是:

<html>
    <head>
        <meta charset="UTF-8" />
        <meta http-equiv="refresh" content="0;url='%1$s'" />

        <title>Redirecting to %1$s</title>
    </head>
    <body>
        Redirecting to <a href="%1$s">%1$s</a>.
    </body>
</html>

这指向我的家。

我尝试检查从哪里完成此重定向,但无法理解。并且不是通过 RedirectIfAuthenticated。

我希望看到带有错误消息的 JSON 响应。

即使是 Laravel 文档中用于创建令牌的示例代码,如果验证失败,也会有此重定向,此代码:

        $request->validate([
            'email' => 'required|email',
            'password' => 'required',
            'device_name' => 'required',
        ]);

        $user = User::where('email', $request->email)->first();

        if (! $user || ! Hash::check($request->password, $user->password)) {
            throw ValidationException::withMessages([
                'email' => ['The provided credentials are incorrect.'],
            ]);
        }

        return $user->createToken($request->device_name)->plainTextToken;

并且仅当验证失败但没有重定向时,所以我认为验证会重定向回来,但由于没有,它会重定向到家。

谢谢

更新

我找到了一种解决方法,但不确定这是否是唯一的方法。

添加一个 try catch 我可以在不重定向的情况下显示验证错误。


    try {

        $data = $request->validate([
            'name' => 'required',
            'email' => 'required|email|unique:users,email',
            'password' => 'required',
        ]);

    } catch(\Illuminate\Validation\ValidationException $e) {
        
        return response()->json([
            'message' => $e->getMessage()
        ]);
    }
4

1 回答 1

17

您可能希望发送Accept标头,application/json以便服务器知道您正在接受 JSON。这是异常处理程序如何确定如何从验证异常返回响应的一部分。

于 2020-09-03T11:25:41.920 回答