如何将 laravel CSRF 令牌值传递给 vue

新手上路,请多包涵

我有这种形式,用户应该只在文本区域内键入文本:

             <form action="#" v-on:submit="postStatus">{{-- Name of the method in Vue.js --}}
                <div class="form-group">
                    <textarea class="form-control" rows="5" maxlength="140" autofocus placeholder="What are you upto?" required v-model="post"></textarea>
                </div>
                <input type="submit" value="Post" class="form-control btn btn-info">

                {{ csrf_field() }}

            </form>

然后,我有这个脚本代码,我将 vue.js 与 ajax 一起使用,以便将该文本传递到控制器并最终将其保存到数据库中:

 //when we actually submit the form, we want to catch the action
    new Vue({
        el      : '#timeline',
        data    :   {
            post    : '',
        },
        http    :   {
            headers: {
                'X-CSRF-Token': $('meta[name=_token]').attr('content')
            }
        },
        methods : {
            postStatus : function (e) {
                e.preventDefault();
                console.log('Posted: '+this.post+ '. Token: '+this.token);
                $.ajax({
                    url         :   '/posts',
                    type        :   'post',
                    dataType    :   'json',
                    data        :   {
                        'body'  :   this.post,
                    }
                });
            }
        },
    });

但是,到目前为止,这不起作用,因为存在此令牌不匹配异常。我不知道如何使它工作。如何将此令牌值传递给控制器。我尝试了以下方法:

1)在表单中,我为令牌添加了一个 vue 名称:

 <input type="hidden" name="_token" value="YzXAnwBñC7qPK9kg7MGGIUzznEOCi2dTnG9h9çpB" v-model="token">

2)我试图将此令牌值传递给vue:

 //when we actually submit the form, we want to catch the action
    new Vue({
        el      : '#timeline',
        data    :   {
            post    : '',
            token   : '',
        },
        methods : {
            postStatus : function (e) {
                e.preventDefault();
                console.log('Posted: '+this.post+ '. Token: '+this.token);
                $.ajax({
                    url         :   '/posts',
                    type        :   'post',
                    dataType    :   'json',
                    data        :   {
                        'body'  :   this.post,
                        '_token':   this.token,
                    }
                });
            }
        },
    });

…但在控制台中,vue 甚至没有捕捉到它:(

这导致我出现以下错误:

VerifyCsrfToken.php 第 68 行中的 TokenMismatchException:

我如何解决它?有任何想法吗?

原文由 Pathros 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 625
2 个回答

由于这两个答案,我解决了它:

1)首先我读 了这个,这导致我

  1. 第二个

所以,在我的表格中,我保留了这个:

{{ csrf_field() }}

在 js 文件中,我只添加以下内容(在 Vue 实例之外和之上):

var csrf_token = $('meta[name="csrf-token"]').attr('content');

所以整个js代码是:

 var csrf_token = $('meta[name="csrf-token"]').attr('content');
    /*Event handling within vue*/
    //when we actually submit the form, we want to catch the action
    new Vue({
        el      : '#timeline',
        data    :   {
            post    : '',
            token   : csrf_token,
        },
        methods : {
            postStatus : function (e) {
                e.preventDefault();
                console.log('Posted: '+this.post+ '. Token: '+this.token);
                $.ajax({
                    url         :   '/posts',
                    type        :   'post',
                    dataType    :   'json',
                    data        :   {
                        'body'  :   this.post,
                        '_token':   this.token,
                    }
                });
            }
        },
    });

原文由 Pathros 发布,翻译遵循 CC BY-SA 3.0 许可协议

Very Easy Solution 只需在表单内添加一个 隐藏字段。一个例子

<form id="logout-form" action="/logout" method="POST" style="display: none;">
    <input type="hidden" name="_token" :value="csrf">
</form>

现在在 vue 文件的 脚本 中添加 csrf 变量,像这样。 (请记住,它必须在 data 内部)。

 <script>
     export default {
        data: () => ({
            csrf: document.querySelector('meta[name="csrf-token"]').getAttribute('content'),
          }),
    }
</script>

注意,您将在 blade.php 文件中看到这样的元标记。

 <!-- CSRF Token -->
<meta name="csrf-token" content="{{ csrf_token() }}">

如果没有这样的东西,你需要把它放在那里。

原文由 Md. Harun Or Rashid 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题