1

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

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

当我发布时,我在控制台中出现此错误:POST http://localhost:3000 / logout 419 (unknown status)

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

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

2 回答 2

2

我认为有更好的方法来做到这一点。我将与您分享一个想法。

关于令牌

不需要像您那样将令牌由后端共享到前端。

关于 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 组件的一个名为“logout”的方法。方法:

export default{
    // Some code...
    
    methods:{
        logout() {
            this.$inertia.post(route('logout'));
        },
    }
}

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

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

于 2021-05-31T15:02:04.647 回答
1

我找到了解决方案。

我的错误在于恢复了不好的 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
})

这个链接帮助了我

于 2021-01-08T23:36:38.877 回答