[php] Laravel csrf token no coincide con ajax POST Request



Answers

La mejor manera de resolver este problema "X-CSRF-TOKEN" es agregar el siguiente código a su diseño principal, y continuar haciendo sus llamadas ajax normalmente:

En encabezado

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

En script

<script type="text/javascript">
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});
</script>
Question

Estoy tratando de eliminar datos de la base de datos a través de ajax.

HTML:

@foreach($a as $lis)
  //some code
  <a href="#" class="delteadd" id="{{$lis['id']}}">Delete</a>
  //click action perform on this link                  
@endforeach

Mi código ajax:

$('body').on('click', '.delteadd', function (e) {
e.preventDefault();
//alert('am i here');
if (confirm('Are you sure you want to Delete Ad ?')) {
    var id = $(this).attr('id');
    $.ajax({
        method: "POST",
        url: "{{url()}}/delteadd",
        }).done(function( msg ) {
        if(msg.error == 0){
            //$('.sucess-status-update').html(msg.message);
            alert(msg.message);
        }else{
            alert(msg.message);
            //$('.error-favourite-message').html(msg.message);
        }
    });
} else {
    return false;
}
});

Esta es mi consulta para obtener datos de la base de datos ...

$a = Test::with('hitsCount')->where('userid', $id)->get()->toArray();

Pero cuando hago clic en Eliminar datos de enlace no eliminados y muestro csrf_token no coincide ...




Acabo de agregar headers: en la llamada ajax:

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

en vista:

<div id = 'msg'>
     This message will be replaced using Ajax. Click the button to replace the message.
</div>

{{ Form::submit('Change', array('id' => 'ajax')) }}

función ajax:

<script>
 $(document).ready(function() {
    $(document).on('click', '#ajax', function () {
      $.ajax({
         type:'POST',
         url:'/ajax',
         headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
         success:function(data){
            $("#msg").html(data.msg);
         }
      });
    });
});
</script>

en el controlador:

public function call(){
    $msg = "This is a simple message.";
    return response()->json(array('msg'=> $msg), 200);
}

en routes.php

Route::post('ajax', 'AjaxController@call');



Debe incluir un campo de token oculto de CSRF (falsificación de solicitudes entre sitios) en el formulario para que el middleware de protección CSRF pueda validar la solicitud.

Laravel genera automáticamente un "token" de CSRF para cada sesión de usuario activa administrada por la aplicación. Este token se utiliza para verificar que el usuario autenticado es el que realmente realiza las solicitudes a la aplicación.

Por lo tanto, al realizar solicitudes ajax, deberá pasar el token csrf a través del parámetro de datos. Aquí está el código de muestra.

var request = $.ajax({
    url : "http://localhost/some/action",
    method:"post",
    data : {"_token":"{{ csrf_token() }}"}  //pass the CSRF_TOKEN()
  });



Si está utilizando jQuery para enviar publicaciones AJAX, agregue este código a todas las vistas:

$( document ).on( 'ajaxSend', addLaravelCSRF );

function addLaravelCSRF( event, jqxhr, settings ) {
    jqxhr.setRequestHeader( 'X-XSRF-TOKEN', getCookie( 'XSRF-TOKEN' ) );
}

function getCookie(name) {
    function escape(s) { return s.replace(/([.*+?\^${}()|\[\]\/\\])/g, '\\$1'); };
    var match = document.cookie.match(RegExp('(?:^|;\\s*)' + escape(name) + '=([^;]*)'));
    return match ? match[1] : null;
}

Laravel agrega una cookie XSRF a todas las solicitudes, y la adjuntamos automáticamente a todas las solicitudes AJAX justo antes de enviarla.

Puede reemplazar la función getCookie si hay otra función o el complemento jQuery para hacer lo mismo.






Links