返回

Laravel Fortify 与 Sanctum:如何解决 POST /logout 419 未知状态

vue.js

Laravel Fortify 与 Sanctum:解决 POST /logout 419 未知状态

在使用 Laravel Fortify 与 Sanctum 进行 Vue SPA 身份验证时,我们可能遇到 POST /logout 请求返回 419 未知状态的问题。这通常是由CSRF令牌不匹配引起的。

问题

当遇到 POST /logout 419 未知状态时,需要考虑以下问题:

  • 正确配置中间件
  • 正确设置客户端标头
  • 正确使用退出函数

解决方案

要解决此问题,可以采取以下步骤:

确保正确设置中间件

routes/api.php 中添加以下中间件:

Route::group(['middleware' => 'auth:sanctum'], function () {
    // API 路由
});

使用 axios.create 创建单独的 Axios 实例

main.js 中,使用 axios.create 创建一个具有默认标头的单独的 Axios 实例。将 CSRF 令牌设置为默认标头,以避免在每个请求中手动添加它。

const axiosInstance = axios.create({
    headers: {
        'X-XSRF-TOKEN': decodeURIComponent(getCookie('XSRF-TOKEN')),
    },
    withCredentials: true,
});

更新退出函数

使用 axiosInstance 发出 POST /logout 请求,而不是手动设置标头。

const logout = async () => {
    axiosInstance.post('http://localhost:80/logout').then(() => {
        router.push('/login');
    });
};

其他提示

除了上述解决方案外,还有一些其他提示可以帮助解决此问题:

  • 确保服务器和客户端时钟同步。
  • 检查浏览器控制台中是否有任何其他错误消息。
  • 禁用浏览器扩展或插件,因为它们可能会干扰请求。

常见问题解答

1. 如何检查 CSRF 令牌?

您可以通过运行以下命令检查 CSRF 令牌:

php artisan get:csrf-token

2. 如何解决“未经身份验证”错误?

确保已在 config/cors.php 中配置跨域资源共享(CORS)。

3. 如何更新退出函数?

按照上述“更新退出函数”部分中的步骤进行操作。

4. 如何确保服务器和客户端时钟同步?

您可以使用以下命令同步服务器和客户端时钟:

ntpdate ntp.org

5. 如何禁用浏览器扩展?

这取决于您使用的浏览器。请参阅浏览器的帮助文档以了解如何禁用扩展。

结论

通过采取本文中概述的步骤,您可以解决 Laravel Fortify 与 Sanctum 中的 POST /logout 419 未知状态问题。通过确保正确配置中间件、设置客户端标头和使用更新的退出函数,您可以确保您的 SPA 身份验证系统安全且正常运行。