首页 > 解决方案 > Laravel AJAX Request Post 错误代码:使用 laravel auth 登录时会话 ID 更改后的 419

问题描述

我的 AJAX 请求返回错误代码 419 时遇到问题。AJAX 使用 POST 方法。我已经csrf_token()像这样使用了:

<meta name="csrf-token" content="{{ csrf_token() }}">
$.ajaxSetup({
    headers: {
        "X-CSRF-TOKEN": $("meta[name='csrf-token']").attr("content")
    }
});

AJAX 请求在注册和注销时起作用。但是登录时,我的 AJAX 请求返回 419。因此,错误代码 419 表示会话已过期,所以我认为我的 CSRF 令牌有问题。

我尝试为每个 AJAX 请求使用不同的 CSRF 令牌,但仍然没有运气。在深入LoginController研究Auth方法之后,我发现在sendLoginResponse函数 ( AuthenticatesUsers.php > AuthenticatesUsers > sendLoginResponse) 中“会话标识符”重新生成。

$request->session()->regenerate();

我尝试删除这行代码,果然 AJAX 请求有效。但后来我在 Laravel 文档中读到,它将“防止恶意用户利用对您的应用程序的会话固定攻击”。

因此,我没有删除它。

我尝试了许多其他我不会让您感到厌烦的事情,但是在寻找修复程序时,我发现了一个异常(?)。我发现在 F12 菜单中,转到“应用程序”,然后查看 Cookies,我发现在登录时,名为“laravel_session”的 cookie 更改了 3 次,而不是在我注销时更改了两次。

Jquery 版本:3.5.1 PHP 版本:7.4.7 对于 SQL,我使用 XAMPP v3.2.4(我认为)

编辑:

我做了更多的事情,我发现如果会话 id 被重新生成,浏览器/ajax 将不接受响应。现在,419 的错误代码还带有“CSRF 令牌不匹配”的错误消息,这可能表明包含会话 id 信息的 cookie 存在问题。

在搜索了这个错误消息之后,我发现会话 id 是用于授权登录信息的。因此,重新生成会话 id 后,在授权登录时可能会与之前的会话 id 发生冲突。

虽然这一切都只是猜测。

最后,这都是一个奇怪的例子,我也很惊讶我在互联网上的任何地方都没有找到这样的东西。我认为这不是 AJAX 请求或默认 Laravel 身份验证方法的问题。

顺便说一句,这是我用来安装登录身份验证的命令。

composer require laravel/ui
php artisan ui vue --auth

标签: phpjqueryajaxlaravelauthentication

解决方案


您必须将X-XSRF-TOKENXSRF Coo​​kie 中的令牌一起使用,而不是CSRF 令牌

如果你使用的是 Vue。

欲了解更多信息:https ://stackoverflow.com/a/64992490/9287628


推荐阅读