我在堆栈laravel 8/jetstream/inertiajs中有一个注销错误



我正在尝试设置注销路由。

我发现了很多blade语法(像那样(,但没有一个使用vuejs。因此,我试图通过插入一个值为csrf令牌、名称设置为"的输入来复制刀片语法的结果_令牌";。(csrf变量包含位于XSRF-TOKEN cookie中的字符串(。

当我发布时,我在控制台中出现以下错误:POST http://localhost:3000/logout 419(未知状态(

你能告诉我我的错误在哪里吗?如何正确注销并重定向到我选择的页面?

<form method="POST" :action="$route('logout')">
<input type="hidden" name="_token" :value="csrf">
<button type="submit">Logout</button>
</form>

我认为有更好的方法。我会和你分享一个想法。

关于令牌

没有必要像您所做的那样,通过后端向前端共享令牌。

关于Vue组件中的代码

由于您的表单,注销不起作用。

您的表单POST

<form method="POST" :action="$route('logout')">
<input type="hidden" name="_token" :value="csrf">
<button type="submit">Logout</button>
</form>

表单POST的最佳方式

<form @submit.prevent="logout()">
<button as="button" type="submit">
Logout
</button>
</form>

正如您所看到的,当您提交表单时,它将调用vue组件的一个名为"的方法;注销";。方法:

export default{
// Some code...

methods:{
logout() {
this.$inertia.post(route('logout'));
},
}
}

以这种方式进行注销过程,所有逻辑注销都将由服务器端处理。您将不必担心代币。

我希望它对你有用。我也很感谢你,因为我刚刚因为你的回答找到了这个解决方案。

我找到了解决方案。

我的错误是在恢复csrf令牌,这是不好的。我会检索XSRF-TOKEN cookie中包含的长字符串,而我必须从后端接收令牌。这两个字符串完全不同,出于某种原因,我还不知道。

我只需要用csrf_token((方法将csrf令牌发送到我的前端

return Inertia::render('Dashboard', [
'publications' => $publications,
'users' => $users,
'csrf_token' => csrf_token()
]);

也不需要我手动填写表格

最后,我能够获得代币作为道具,并将其包含在我的帖子请求中,如下所示:

this.$inertia.post('/logout', {
_token: this.$props.csrf_token
})

这个链接帮助我

相关内容

最新更新