Laravel AJAX Request Post 错误代码:使用 laravel auth 登录时会话 ID 更改后的 419

Posted

技术标签:

【中文标题】Laravel AJAX Request Post 错误代码:使用 laravel auth 登录时会话 ID 更改后的 419【英文标题】:Laravel AJAX Request Post error code: 419 after session id changed when logging in using laravel auth 【发布时间】:2020-11-07 04:47:02 【问题描述】:

我的 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 令牌,但仍然没有成功。在Auth方法的LoginController中挖掘之后,我发现在sendLoginResponse函数(AuthenticatesUsers.php &gt; AuthenticatesUsers &gt; 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 token mismatch”的错误信息,这可能表明包含会话id信息的cookie有问题。

查了一下这个错误信息,我发现session id是用来授权登录信息的。所以重新生成的session id,在授权登录时可能会和之前的session id冲突。

虽然这一切都只是猜测。

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

顺便说一下,这是我用来安装登录验证东西的命令。

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

【问题讨论】:

你可以试试标头 X-XSRF-TOKEN(不是 X-CSRF-TOKEN)。嗯,看完你的问题,我不认为那不是问题。 会话和 xsrf 在每次响应时都会发送很长的消息,因此登录控制器重新生成会话这一事实不会影响任何事情。中间件将在控制器代码运行之前起作用,并且您的会话尚未重新生成。因此,“我尝试删除该行代码,果然 AJAX 请求有效。” @KurtFriars 我试过 X-XSRF-TOKEN 并返回 500 并显示消息“有效负载无效” 你能从 $request->session()->regenerate(); 中 dd() 获取堆栈跟踪吗?线是?并在您的问题中分享? @KurtFriars 我会看看我能做什么 【参考方案1】:

您必须将 X-XSRF-TOKEN 与来自 XSRF Coo​​kie 的令牌一起使用,而不是 CSRF 令牌

如果你使用的是 Vue。

更多信息:https://***.com/a/64992490/9287628

【讨论】:

以上是关于Laravel AJAX Request Post 错误代码:使用 laravel auth 登录时会话 ID 更改后的 419的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 6 中使用 PUT 方法 AJAX 会导致空的 $request->all() 数组

Laravel $request->expectsJson()

Laravel,尝试通过 AJAX 向控制器传递数据时出现不匹配的令牌错误

在 Laravel 5.5 中使用 AJAX

Laravel Yajra 不接受 post/get 查询请求

Jquery:使用 laravel 的跨域 ajax 'POST'