Laravel 5.4 TokenMismatchException 和注销

Posted

技术标签:

【中文标题】Laravel 5.4 TokenMismatchException 和注销【英文标题】:Laravel 5.4 TokenMismatchException and Logout 【发布时间】:2018-07-11 05:11:00 【问题描述】:

我遇到了有史以来最奇怪的错误,不知道从哪里开始调试。我有一个表格,用于向客户发送一些电子邮件。此表单通过 ajax 提交到服务器并返回响应。

$.post(' route('some.route') ', $('#check-form').serialize(), function (data) 
                buildNotification('Success', "Sent email, 'success');

                doAction('reset', true);
            ).fail(function (err) 
                buildNotification('Error!!!', err.message !== undefined ? err.message : "Failed sending email", 'danger');

                doAction('reset', true);
            );

我还在我的表单中设置了 csrf_field() ,如果我在网络选项卡中检查 Chrome 开发工具,我可以看到 `_token' 字段已设置。

问题是当我提交请求时,来自服务器的响应是TokenMismatchExceptionhtml。我禁用了指定路由的令牌验证,我仍然得到一个 TokenMismatchException..

在此之后,如果我刷新页面,我会再次重定向到登录页面(所以我猜会话会以某种方式被破坏)。我搜索了所有我能找到的东西,但似乎没有任何东西适用于我的情况。

我注意到的另一件事是,我只有在 Chrome(在我的情况下为 Chromium)上运行时才会出现这种行为。还尝试了隐身模式,因为我认为某些扩展可能会导致错误,但不,仍然是同样的问题。

关于如何解决此问题的任何想法?

【问题讨论】:

【参考方案1】:

这是 Laravel 使用 Axios 配置任何 ajax 调用的方式。取自 bootstrap.js。

/**
 * Register the CSRF Token as a common header with Axios so that
 * all outgoing HTTP requests automatically have it attached. This is just
 * a simple convenience so we don't have to attach every token manually.
 */

let token = document.head.querySelector('meta[name="csrf-token"]');

if (token) 
    window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
 else 
    console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');

但是,当您使用 JQuery 时,您需要确保已配置您的 ajax 设置,以便它可以传递 crsf 字段,如下所示。

// main.blade.php
<meta name="csrf-token" content=" csrf_token() " />


// boostrap.js, after you have imported jquery

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

希望这样可以解决问题。

【讨论】:

虽然这是一个有效的观点,但 OP 已经提到他们将令牌包含在表单数据有效负载中。 是的。 CSRF 令牌已经通过隐藏的input 在表单字段中发送,名称为_token.. 我认为这可能是一个 Chromium 错误,因为在 Chrome 或 Firefox 中一切似乎都运行良好:/

以上是关于Laravel 5.4 TokenMismatchException 和注销的主要内容,如果未能解决你的问题,请参考以下文章

TokenMismatch ONLY 某些浏览器 - Laravel 5 Fresh/Production

Laravel 5.3 到 5.4 (mPdf - niklasravnsborg/laravel-pdf ) 升级问题

laravel-5.4 - 错误:从空值创建默认对象

laravel 5.4 在邮件中嵌入图像

Laravel 5.4 有时验证规则不起作用

从 5.4 升级后的 Laravel 419 发布请求