Recibo un error "419 (estado desconocido)" con el mensaje "No coincide el token CSRF".
POST http://127.0.0.1:8000/login 419 (estado desconocido)
Falta de coincidencia del token CSRF.
Servidor Laravel: http://127.0.0.1:8000
Servidor Vue: http://localhost:8080
aplicación/Http/Kernel.php
'api' => [ \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ],
aplicación/Modelos/Usuario.php
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens; class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable; //... }
config/cors.php
<?php return [ 'paths' => [ 'api/*', 'sanctum/csrf-cookie', 'register', 'login', ], 'allowed_methods' => ['*'], 'allowed_origins' => ['*'], 'allowed_origins_patterns' => [], 'allowed_headers' => ['*'], 'exposed_headers' => [], 'max_age' => 0, 'supports_credentials' => true, ];
.env
SESSION_DRIVER=cookie SESSION_DOMAIN=localhost SANCTUM_STATEFUL_DOMAINS=localhost:8080
src/principal.js
axios.interceptors.request.use((config) => { config.baseURL = 'http://127.0.0.1:8000' config.withCredentials = true return config })
src/views/auth/Login.vue
import axios from 'axios' import { reactive } from '@vue/reactivity'; export default { setup() { const credential = reactive({ email: '', password: '', }) const login = async () => { axios.get('/sanctum/csrf-cookie').then( async () => { let response = await axios.post('/login', credential) console.log(response); }); } return { login, credential } } };
Me costó mucho lidiar con este mismo problema. Después de varias búsquedas llegué a esta página. Habiendo visto posibles soluciones sugeridas, cambié
SANCTUM_STATEFUL_DOMAINS=localhost:8080
a
SANCTUM_STATEFUL_DOMAINS=http://localhost:8080
¡Y eso fue todo! ¡Funcionó bien!
Tiene su SANCTUM_STATEFUL_DOMAINS
establecido en localhost:8080
, pero el resto del código muestra que está ejecutando en el puerto 8000 en lugar de 8080. Si cambia eso a 8000, debería estar listo.