Mi aplicación usa React en el front-end y Laravel 5.4 en el back-end. Estoy usando fetch()
para solicitar datos del backend. El problema es que se crean dos sesiones cuando se carga la página. El CSRF Middleware lanza una TokenMismatchException
cuando se realiza una solicitud POST
porque el token que se envía coincide con la primera sesión que se crea, pero se compara con la segunda.
Estoy configurando el token en app.blade.php
<meta name="_token" content="{{ csrf_token() }}">
Y agarrando el token en la configuración de búsqueda
fetchConfig = { headers: { 'Content-Type': 'application/json', 'Accept': 'application/json', 'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content') }, credentials: 'same-origin' }}
Aquí están las sesiones descifradas:
a:3:{s:6:"_token";s:40:"7obvOzPaqqJDtVdij8RaqrvmTFLjKA2qnvYMxry6";s:9:"_previous";a:1:{s:3:"url";s:24:"http://localhost/page";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}} a:3:{s:6:"_token";s:40:"5Aiws9Qy72YzlkfWX81zkhzrSeiMDYjFWiLeDAwN";s:9:"_previous";a:1:{s:3:"url";s:41:"http://localhost/api/page";}s:6:"_flash";a:2:{s:3:"old";a:0:{}s:3:"new";a:0:{}}}
URL de solicitud: http://localhost/page
URL de la API: http://localhost/api/page
¿Cómo puedo evitar que se cree una nueva sesión cuando la aplicación React realiza su solicitud GET
inicial?
Laravel genera automáticamente un "token" 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. : https://laravel.com/docs/5.4/csrf
Las API no tienen estado. No hay nada como session
en las API. Por lo tanto, no debe usar el token CSRF en la API. Si revisaKernel.php
de laravel. Verá que Tylor no agregó el middleware VerifyCsrf
en el grupo API. Lo que sugiere que CSRF
solo se usa en la solicitud que tiene sesión, es decir, solicitud con estado. Le recomendaría que use el sistema de autenticación basado en JWT para la API. Para obtener más información sobre JWT , consulte aquí .
Puede usar este paquete laravel para JWT: https://github.com/tymondesigns/jwt-auth
No estoy seguro de cuál es su URL de solicitud y cuál es su URL de API de destino. Asegúrese de que ambos estén en el mismo dominio (incluido el subdominio).
Creo que es una buena idea deshabilitar la validación CSRF solo para las rutas API, ya que pueden ser utilizadas por otros dominios, aplicaciones nativas, etc.
Puede hacerlo agregando el siguiente archivo de clase: app/Http/Middleware/VerifyCsrfToken.php
<?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier; class VerifyCsrfToken extends BaseVerifier { /** * The URIs that should be excluded from CSRF verification. * * @var array */ protected $except = [ 'api/*', ]; }
Asegúrate de editar Kernal.php
para apuntar a la nueva clase:
protected $middleware = [ 'csrf' => 'App\Http\Middleware\VerifyCsrfToken' ];
Para obtener más información sobre cómo Laravel usa CSRF, consulte este video de laracast