Cuando hacemos peticiones a nuestro backend desde otro servidor (Como por ejemplo, desde nuestro framework fronted, alojado en otra dirección), nos dará un error de acceso no permitido CORS (Cross-Origin Request Blocked).
Este error no es específico de Laravel, sino que es un método de seguridad que se da en las peticiones que se hagan a otro servidor y no se tenga acceso. Para solucionar esto, manteniendo la seguridad, vamos a crear un middleware en las rutas que queramos realizar dichas peticiones.
Solución 1: Middleware personalizado (Laravel 5.x a 6.x)
Creando middleware para CORS
Crearemos el middleware en nuestro proyecto, ejecutando el siguiente comando:
php artisan make:middleware Cors
Ahora, nos dirigimos a la clase creada, que se encuentra en app/Http/Middleware/Cors.php y añadiremos esto:
<?php
namespace App\Http\Middleware;
use Closure;
class Cors
{
public function handle($request, Closure $next)
{
return $next($request)
//Url a la que se le dará acceso en las peticiones
->header("Access-Control-Allow-Origin", "http://urlfronted.example")
//Métodos que a los que se da acceso
->header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE")
//Headers de la petición
->header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, X-Token-Auth, Authorization");
}
}
Como siempre, registramos nuestro middleware en app/Http/kernel.php
protected $routeMiddleware = [
...,
...,
"cors" => \App\Http\Middleware\Cors::class,
];
Y por último añadimos el middleware en la/s rutas que queramos permitir estas peticiones:
Route::group(['middleware' => ['cors']], function () {
//Rutas a las que se permitirá acceso
});
Solución 2: Middleware nativo (config/cors.php) – Laravel 7 en adelante
Desde Laravel 7, no necesitas crear un middleware personalizado para CORS. Laravel ya incluye soporte nativo mediante el paquete fruitcake/laravel-cors, que viene preinstalado y configurado por defecto.
1. Publicar el archivo de configuración
php artisan config:publish cors
2. Editar el archivo config/cors.php
return [
'paths' => ['api/*', 'sb-json'],
'allowed_methods' => ['GET', 'POST'],
'allowed_origins' => ['https://tudominio.com'],
'allowed_headers' => ['*'],
'supports_credentials' => false,
];
3.Limpiar y recompilar caché de configuración
php artisan config:clear
php artisan config:cache