【问题标题】:TokenMismatchException Laravel Contact FormTokenMismatchException Laravel 联系表
【发布时间】:2017-09-29 06:53:43
【问题描述】:

我了解您需要一个 csrf_token(),如其他问题/答案中所述,但如果我从无法获取令牌的外部服务器进行调用怎么办?

第一次在 Laravel 中构建任何东西。我只是在构建一个简单的 ajax 联系表单来熟悉它。

这是我的 JS(会有一些客户端处理,所以我需要单独的值,而不是直接序列化它)

$('#contact-form').on('submit', function(e){

    e.preventDefault();

    $.ajax({
        type: 'POST',
        url: 'forms/contact.php',
        dataType: "json",
        data: {

            name: encodeURIComponent($("#contact-name").val()),
            email: encodeURIComponent($("#contact-email").val()),
            phone: encodeURIComponent($("#contact-phone").val()),
            subject: encodeURIComponent($("#contact-subject").val()),
            message: encodeURIComponent($("#contact-message").val())


        },
        success: function(data) {

            alert(data.message);

        }

    });

});

这是我的路线(在 web.php 中)

Route::post('forms/contact.php', 'ContactController@send'); 

这是我的联系人控制器的主要公共功能“发送”

public function send(Request $request){

    return response()->json([
        'result' => true,
        'message' => 'success'
    ]);
}

现在的主要目标是将成功的消息返回到表单。

...有人知道我将如何使用类似的方法将验证返回到表单吗?

    $this->validate($request, [
        'name' => 'required',
        'email' => 'required|email',
        'message' => 'required'
    ]);

对不起,我昨天拿起了 Laravel,所以我是超级菜鸟

【问题讨论】:

标签: php forms laravel


【解决方案1】:

Laravel 有一个 CRSF 令牌,它要求您将密钥传递给存储在会话中的 POST 调用。如果此令牌不匹配或不存在,它将拒绝该请求。你可以阅读更多关于这个here

如何解决:

        name: encodeURIComponent($("#contact-name").val()),
        email: encodeURIComponent($("#contact-email").val()),
        phone: encodeURIComponent($("#contact-phone").val()),
        subject: encodeURIComponent($("#contact-subject").val()),
        message: encodeURIComponent($("#contact-message").val()),
        _token: "{{ csrf_token() }}"

【讨论】:

  • 假设我在一台服务器上构建了一个基于 Laravel 的 API,并且我想从另一台服务器调用它,我将如何获取该 csrf_token?使用经过身份验证的端点是否有意义?
  • 您需要改用 API 身份验证。
  • 哦,好吧,所以这不是我想做的,哈哈。好吧,这会很好用。我将标记为正确,但对于我的项目,我将不得不进行身份验证。谢谢!
  • ...这让我等了 6 分钟才能将其标记为正确
【解决方案2】:

默认情况下,Laravel 会保护你免受 CSRF 攻击(使用 web 中间件时)。

在此处了解更多信息:https://laravel.com/docs/5.4/csrf

一种简单的方法是在页面中输出 CSRF 令牌,然后使用 Javascript 代码获取令牌并将其存储到全局变量中。

在您的邮件 html 页面模板中:

<script>
    window.Laravel = <?php echo json_encode([
        'csrfToken' => csrf_token(),
    ]); ?>
</script>

然后,在任何 post、put 和 patch 请求中发送它,标头值 X-CSRF-TOKEN

例如,在你的 post call 中使用 jQuery ajax:

$('#contact-form').on('submit', function(e){

    e.preventDefault();

    $.ajax({
        type: 'POST',
        beforeSend: function(request) {
          request.setRequestHeader("X-CSRF-TOKEN", Laravel.csrfToken);
        },
        url: 'forms/contact.php',
        dataType: "json",
        data: {

            name: encodeURIComponent($("#contact-name").val()),
            email: encodeURIComponent($("#contact-email").val()),
            phone: encodeURIComponent($("#contact-phone").val()),
            subject: encodeURIComponent($("#contact-subject").val()),
            message: encodeURIComponent($("#contact-message").val())


        },
        success: function(data) {

            alert(data.message);

        }

    });
});

【讨论】:

    猜你喜欢
    • 2015-10-04
    • 2016-03-06
    • 2017-03-28
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多