How to pass laravel CSRF token value to vue

后端 未结 6 658
滥情空心
滥情空心 2020-12-02 22:57

I have this form where the user should only type text inside a text area:

            
{{-- Name of the me
相关标签:
6条回答
  • 2020-12-02 23:27

    Automatic Axios CSRF token attaching Solution:

    first, store the token in an HTML meta tag:

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

    Then register the CSRF Token as a common header with Axios so that all outgoing HTTP requests automatically have it attached.

    Inside your bootstrapping/main JS file, include:

    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');
    }
    

    Now you can make requests with csrf attached.

    0 讨论(0)
  • 2020-12-02 23:32

    A better way is simply to pass the csrf token via a slot into the vue component.

    In blade.php file:

    @extends('layouts.app')
    
    @section('content')
              <my-vue-component>
                {{ csrf_field() }}
              </my-vue-component>
    @endsection
    

    In MyVueComponent.vue

       <form role="form">
           <slot>
             <!-- CSRF gets injected into this slot -->
           </slot> 
           <!-- form fields here -->
        </form>
    
    0 讨论(0)
  • 2020-12-02 23:32

    I solved it thanks to these two answers:

    1) First I read this one, which led me to

    2) This second one.

    So, in my form I keep this:

    {{ csrf_field() }}

    And inside the js file I only add the following (outside and above the Vue instance):

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

    So the whole js code is:

    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,
                        }
                    });
                }
            },
        });
    
    0 讨论(0)
  • 2020-12-02 23:33

    Very Easy Solution Just add a hidden field inside the form. An Example

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

    Now add csrf variable inside script at the vue file, like this. (Remember, it must be inside data).

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

    N.B. You will see a meta tag in your blade.php file like this.

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

    If there is nothing like this, you need to place it there.

    0 讨论(0)
  • 2020-12-02 23:41

    Simply, I would suggest to put this in your PHP file:

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

    This way you're able to easily import your csrfToken from the JS part (Vue in this case).

    Moreover, if you insert this code in your PHP layout file, you can use the token by any component of your app, since window is a JS global variable.

    Source: I got the trick from this post.

    0 讨论(0)
  • 2020-12-02 23:45

    My solution to this is that all vue components get csrf token right before a request is made. I put this in my bootstrap.js file.

    Vue.http.interceptors.push((request, next) => {
       request.headers.set('X-CSRF-TOKEN', CoolApp.csrfToken);
       next();
    });
    

    Then have a class CoolApp.php

        public function getScriptVariables()
        {
          return json_encode([
              'csrfToken' => csrf_token(),
          ]);
        }
    
    0 讨论(0)
提交回复
热议问题