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