1

语境

使用 Postman,我将以下字段发送到 URL 以在数据库中注册用户http://mywebsite/register

  • 电子邮件

  • 密码

  • 确认密码

  • 姓名

根据文档https://laravel.com/docs/8.x/fortify#registration(我从中找到了上述字段),Fortify 已经定义了路由register,所以我不需要自己定义。

根据文档,根据我的需要,我不需要创建注册表单:我直接使用 Postman 将这些注册数据/register作为 XHR POST 请求数据发送到 Laravel Fortify 的路由。此外,我不需要 Fortify 来返回视图,所以我禁用了它们(https://laravel.com/docs/8.x/fortify#disabling-views)。事实上,我只是等待我将在 Postman 的返回数据中看到的 HTTP 代码响应(见下文)。

Fortify 应该返回什么

因为我已经禁用了视图并且因为我发送了一个 XHR POST 请求(在 Postman 中,我将这个 HTTP 标头与注册请求一起发送:)X-Requested-With = XMLHttpRequest

如果注册尝试成功,Fortify 会将用户重定向到通过应用程序的 fortify 配置文件中的 home 配置选项配置的 URI。如果登录请求是 XHR 请求,将返回 200 HTTP 响应。

如果请求不成功,用户将被重定向回注册屏幕,验证错误将通过共享的 $errors Blade 模板变量提供给您。或者,在 XHR 请求的情况下,验证错误将返回 422 HTTP 响应。

https://laravel.com/docs/8.x/fortify#registration

Fortify 实际返回的内容

它正确地注册了用户。但是我在 Postman 中看到的结果是Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException. 事实上,Fortify 正试图进入主视图。

问题

为什么 Fortify 似乎仍在尝试访问返回的视图路由(未定义,因为我不需要它们),因为我的请求正确地是 XHR POST 请求并且我已经禁用了 Fortify 配置文件中的视图?

4

4 回答 4

2

我想我在 Fortify 文档 ( https://laravel.com/docs/8.x/fortify#registration ) 中发现了一些“有趣”的东西。那里有些东西是不完整的。我想我已经找到了文档中缺少的内容!

我解释。

在我的例子中,一个手机应用程序会显示一个注册表单。它将 Fortify 的注册必填字段发送到 Fortify定义email, password, confirmation_password, ...的 URL 。<LaravelSite>/registerFortify 成功注册用户并将他重定向到主路由。但是,我没有定义任何主路由,因为正如您所理解的,这个 Laravel 站点是一个 API。结果 => 我有这个错误:Symfony\\Component\\HttpKernel\\Exception\\NotFoundHttpException

我已关注文档:我已禁用视图(在 Fortify 配置文件中)。我已经正确指定电话应用程序(实际上是 Postman)发送的请求是 XHR 请求(实际上,我已经发送了标头 X -Requested-With = XMLHttpRequest)。所以 Fortify 应该返回给我一个 HTTP 代码(200这里),而不是试图返回我的主页 URL。

文档中缺少什么?=====>>>> 中间件RedirectIfAuthenticated被执行。在它的句柄方法中有一个重定向:return redirect(RouteServiceProvider::HOME);. 为了使 Fortify 正常工作,必须通过注释禁用此行。

Fortify 文档应该包含与上述句子类似的内容。

应该在他们的 Github 存储库上创建 PR 或问题。

编辑:我们还必须发送这个 HTTP 标头:(Accept: application/json否则在注册成功的情况下,它仍然会显示 404)

于 2021-03-10T13:24:41.147 回答
1

将配置变量 views 设置为 false 将不起作用,因为它只会禁用呈现 fortify 的视图文件,例如登录页面、注册页面、重置密码页面等。

Fortify 路由默认使用中间件 [web],您需要在将视图设置为 false 的同一配置文件中将此中间件值设置为 [api]。

于 2021-03-10T11:30:08.780 回答
1

顺便说一句,我遇到了完全相同的问题。经过 30 分钟的在线搜索,我最终检查了我信任的 Laracast 数据库,并且确定我找到了一个 5 分钟的视频,向我展示了如何(以某种方式)解决问题。

https://laracasts.com/series/laravel-authentication-options/episodes/15

简而言之,您需要做的就是为您的文件添加一个register路由。routes/api.php路由的代码可以从 Fortify 供应商目录中复制: vendor/laravel/fortify/routes/routes.php. 复制第 72/73 行的注册路线。将其粘贴到api.php. 现在将您的请求发布到api/register,它会像在视频上一样工作。

希望有帮助

于 2021-06-01T20:16:17.920 回答
0

正如@JarsOfJam-Scheduler 所说,问题在于 RedirectIfAuthenticated 中间件。您可以通过添加检查在 RedirectIfAuthenticated 中间件中禁用 xhr 请求的重定向。

if(!$request->wantsJson()){
    return redirect(RouteServiceProvider::HOME);
}

并且不要忘记将标题添加到 axios

'Accept': 'application/json',
'Content-Type': 'application/json'
于 2022-01-09T14:49:51.920 回答