Saltar al contenido

Cómo definir el token CSRF en una llamada ajax en Cakephp 3. También cómo CSRF puede estar desactivado para algunas solicitudes ajax

Solución:

El componente CSRF escribe el token actual en los parámetros de solicitud como _csrfToken, puede obtenerlo a través del objeto de solicitud param() método (o getParam() a partir de CakePHP 3.4):

beforeSend: function(xhr){
    xhr.setRequestHeader(
        'X-CSRF-Token',
        <?= json_encode($this->request->param('_csrfToken')); ?>
    );
},

Para que el token esté disponible para todos sus scripts, puede, por ejemplo, hacer que esté disponible globalmente como variable en su plantilla de diseño:

<script>
var csrfToken = <?= json_encode($this->request->param('_csrfToken')) ?>;
// ...
<script>

Luego puede usarlo fácilmente en todas sus solicitudes AJAX:

setRequestHeader('X-CSRF-Token', csrfToken);

El componente CSRF se puede desactivar eliminándolo del administrador de eventos de los controladores. Tendrá que averiguar qué condición necesitaría para hacer eso, por ejemplo, para una acción específica, como esta:

public function beforeFilter(CakeEventEvent $event)
{
    parent::beforeFilter($event);

    if ($this->request->param('action') === 'actionXyz') {
        $this->eventManager()->off($this->Csrf);
    }
}

Si está utilizando el middleware CSRF, el token todavía está disponible como un parámetro de solicitud llamado _csrfToken, deshabilitar el middleware, sin embargo, funciona de manera diferente, ver por ejemplo Cakephp 3.5.6 deshabilita el middleware CSRF para el controlador

Ver también

  • Libro de recetas> Objetos de solicitud y respuesta> Parámetros de solicitud
  • Libro de recetas> Controladores> Componentes> CSRF> Uso del componente Csrf
  • Libro de recetas> Controladores> Componentes> CSRF> Deshabilitar el componente CSRF para acciones específicas

Cada forma tiene un oculto _csrfToken campo que se agrega automáticamente cuando ha habilitado el componente Csrf. Ahora puede obtener fácilmente el token de este campo mediante jquery como $('[name="_csrfToken"]').val().

Una llamada ajax se verá así:

$.ajax({
   url: 'someUrl',
   headers : {
      'X-CSRF-Token': $('[name="_csrfToken"]').val()
   },
   type: 'post',
   ...
});
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *