El Token CSRF en Laravel puede que SOLO funcione SI el usuario esta Autenticado

Video thumbnail

Índice de contenido

Hay algo que debes conocer y que, muy seguramente, la gran mayoría de las personas pasa por alto sobre el bendito token CSRF que utilizamos. En este caso me enfoco en Laravel, pero obviamente se emplea en otros frameworks. Es justamente el token que configuramos cuando enviamos cualquier petición desde un formulario.

Fíjate lo que nos indica la documentación oficial. El token en cuestión es una característica que evita exploits maliciosos, mediante los cuales comandos no autorizados desde otros sitios podrían enviar peticiones a nuestra aplicación.

Hasta aquí todo bien. El detalle importante es que este token funciona únicamente si el usuario está autenticado. Es decir, si el usuario no está autenticado, la validación siempre fallará.

En producción, al enviar un formulario mediante JavaScript con el token configurado en el header, da un error 419 (si eres desarrollador en Laravel lo conoces: ocurre cuando no se pasa el token). En local NO da este error.

No queda claro el porqué de esto, pero me parece que Laravel en local saber mediante la URL o variables de entorno que NO esta en producción y relaja las verificaciones.

¿Cómo solucionarlo?

Aunque le pasemos el token, si el usuario no está autenticado, fallará. La solución es sencilla:

Ir al archivo bootstrap/app.php.

Excluir de la validación la ruta específica del formulario:

bootstrap/app.php

->withMiddleware(function (Middleware $middleware) {
    $middleware->statefulApi();

    $middleware->validateCsrfTokens(except: [
        '/social/subscribe',
    ]);
})

De esta forma, el endpoint deja de requerir autenticación para validar el token. Probé en producción y ahora devuelve 200 OK en lugar del error 419.

En resumen:

  • Si el usuario no está autenticado y usas el token CSRF, te va a dar error.
  • Debes probar bien tus formularios en producción, especialmente si el usuario no necesita iniciar sesión.
  • Dependiendo de cómo pases el token, puede que en unas vistas funcione y en otras no.
  • Así que tenlo presente antes de subir tu aplicación

Acepto recibir anuncios de interes sobre este Blog.

Protege tu Laravel: Cómo Funciona el Token CSRF y la Autenticación.

| 👤 Andrés Cruz

🇺🇸 In english