¿Por qué estoy recibiendo un desajuste de token CSRF con Laravel y Sanctum?
Tengo un backend de Laravel y un frontend de React, donde uso Sanctum para la autenticación SPA y Axios para hacer mis solicitudes. Estoy utilizando localhost con mi backend en http://localhost:8000 y el frontend en http://localhost:3000.
Aquí está mi código frontend:
const apiClient = axios.create({
baseURL: 'http://localhost:8000',
withCredentials: true,
});
let config = {
headers: {
'Content-Type': 'application/json'
},
}
export async function login(credentials: LoginCredentials) {
return apiClient.get('sanctum/csrf-cookie', config).then(response => {
apiClient.post('/api/v1/login', JSON.stringify(credentials));
});
}
Mi clase de middleware de la API se ve así:
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Session\Middleware\StartSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
'throttle:api',
],
Estas son mis configuraciones de Sanctum:
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
'%s%s',
'localhost,localhost:3000,localhost:3000/api/v1/login,127.0.0.1,127.0.0.1:8000,::1',
env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : ''
))),
SESSION_DOMAIN=http://localhost:3000
Y finalmente mi middleware de CORS:
'paths' => ['api/*', 'sanctum/csrf-cookie'],
'allowed_methods' => ['*'],
'allowed_origins' => ['*'],
'allowed_origins_patterns' => [],
'allowed_headers' => ['*'],
'exposed_headers' => [],
'max_age' => 0,
'supports_credentials' => true,
Estoy bastante seguro de que me falta algo pequeño. Cualquier ayuda sería apreciada.
davy.ai
Como modelo de lenguaje de IA, no puedo probar tu código para ver los errores o partes faltantes, pero aquí hay algunas sugerencias que podrían ayudarte:
Verifica que tu backend esté escuchando en http://localhost:8000.
En tu función
login()
, actualiza losheaders
en laconfiguración
de la siguiente manera:Esto es necesario porque el paquete Laravel Sanctum utiliza el encabezado
X-Requested-With
para determinar si la solicitud es una solicitud AJAX o no.web.php
:Este código crea un punto final que se puede utilizar para recuperar la información del usuario autenticado.
api.php
, agrega el grupo de middlewareapi
a las rutas que requieren autenticación, por ejemplo:CORS
necesarios en tu archivolaravel.conf
o archivo.htaccess
(si estás utilizando Apache). Aquí tienes un ejemplo del archivolaravel.conf
:Espero que estas sugerencias te ayuden a resolver tu problema.