Compañeros, alguien sabe como solucionar el siguiente error? He seguido al pie de la letra las intrucciones del curso y en local si funci...

IRIDIAN GUADALUPE CARRERA MONDRAGÓN

IRIDIAN GUADALUPE CARRERA MONDRAGÓN

Pregunta
studenthace 4 años

Compañeros, alguien sabe como solucionar el siguiente error?

He seguido al pie de la letra las intrucciones del curso y en local si funcionan mis peticiones de Postman pero cuando lo subo a internet, me sale el siguiente mensaje:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://misitioweb.com/api/v1/publicaciones/. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

En un fetch le he enviado las cabeceras, también cree un middleware para los cors dentro del proyecto de la API.

4 respuestas
para escribir tu comentario
    IRIDIAN GUADALUPE CARRERA MONDRAGÓN

    IRIDIAN GUADALUPE CARRERA MONDRAGÓN

    studenthace 4 años

    Woooooooo: muchisimas gracias por esa explicación tan buena y tomarte el tiempo de responder a mi pregunta amigo, al fin pude comprender que significa CORS y como funciona, lo que es aún mejor mi aplicación ya funciona.

    Gracias @RetaxMaster

    John Cardenas

    John Cardenas

    studenthace 4 años

    Retax, genial tu respuesta. Muchas gracias 🤘

    Carlos Eduardo Gomez García

    Carlos Eduardo Gomez García

    teacherhace 4 años

    ¡Hola!, déjame darte un contexto sobre qué es esto y cómo solucionarlo:

    CORS es una política de Cross Domain (dominios cruzados) que entra en juego cuando un dominio A le hace una petición a un dominio B.

    Te lo explico en español jaja, básicamente "dominios cruzados" significa que, tú puedes tener un sitio web:

    platzi.com
    y también puedes tener otro
    php.net
    , entonces, si
    platzi.com
    le hace una petición a
    php.net
    entonces se dice que los "dominios están cruzados" porque son dominios diferentes.

    Esta política sirve para proteger los datos de un servidor, ya que imagina que un sitio mal intencionado intenta hacerle peticiones a Platzi para obtener sus datos, entonces sería un problema, gracias a CORS, Platzi puede decidir a quién sí y a quién no responderle esa petición, y esto lo hace por medio de CORS.

    CORS está presente como un encabezado (o header como le conocemos), los headers son datos que viajan en el encabezado de cualquier petición, por ejemplo, si tú haces una petición

    post
    ,
    get
    ,
    put
    o
    delete
    , estas llevarán consigo un header.

    Entonces, ¿por qué en local si funciona y en internet no? Porque en local estás usando el mismo dominio:

    localhost
    o
    127.0.0.1
    , y Postman también está usando ese dominio, por tanto, al ser el mismo dominio, no hay dominios cruzados, por lo que CORS no se alarma.

    Pero al subirlo a internet los dominios cambian y al hacer una petición los dominios se cruzan y CORS se alarma, entonces tú tienes que permitirle a tu backend que pueda responder solicitudes de cualquier dominio, y esto lo haces por mediod e CORS, en específico, lo haces desde su

    header
    .

    En Laravel, puedes hacerlo mediante un middleware que modifique los headers:

    php artisan make:middleware Cors

    Después simplemente en ese middleware (ubicado en

    app/Http/Middleware/Cors.php
    ) agregas esto en la función
    handle
    :

    public function handle($request, Closure $next) { return $next($request) ->header('Access-Control-Allow-Origin', '*') ->header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); }

    Esto modificará el CORS mediante el header

    Access-Control-Allow-Origin
    que se encarga de permitir o denegar orígenes, al ponerle un
    *
    significa que tu backend va a permitir cualquier origen, es decir, va a permitir que cualquier persona pueda hacerle un request a tu backend.

    El header

    Access-Control-Allow-Methods
    va a indicar cuáles son los métodos que estos orígenes tienen permitido ejecutar, en este caso estás permitiendo 5 métodos (básicamente le estás dando permiso de hacer lo que sea)

    Ahora que ya tienes el middleware creado hay que registrarlo para que Laravel lo conozca, eso lo haces en el archivo

    app/Http/Kernel.php
    , aquí simplemente buscas el array
    $routeMiddleware
    y agregas un nuevo elemento, el cual sería tu middleware que acabas de crear:

    'cors' => \App\Http\Middleware\Cors::class,

    Básicamente le estás diciendo que tu middleware se llama

    cors
    (aunque podrías ponerle cualquier nombre) y que ese middleware es manejado por la clase Middleware de CORS que acabamos de crear.

    Después de haberlo creado y haberlo registrado ya solo te queda usaro, puedes usar el middleware desde la ruta (tal como lo hicimos con el

    auth:sanctum
    o también puedes usarlo desde el controlador, esto es básicamente para específicarle a Laravel que rutas o que controladores deben implementar ese middleware que permite a cualquier persona hacer un request).

    Si lo vas a implementar desde un controlador simplemente a ese controlador debes agregarle un constructor y desde ahí llamar al middleware:

    class MyController extends Controller { public functions __construct() { $this->middleware("cors"); } }

    El nombre del middleware es el mismo que le pusiste cuando lo registraste en el

    Kernel.php

    Y listo, con esto ya puedes hacer solicitudes desde cualquier parte, incluso desde Postman, spolo ten en cuenta que cualquier persona puede hacerlo, es decir, puedo llegar yo y desde mi Postman hacerle una solicitud a tu servidor y borrarle algo, es por eso que no es una buena práctica permitir todos los orígenes, y por eso tampoco es buena prática hacerle solicitudes a tu servidor en producción desde Postman jaja, por eso todas las pruebas se hacen en local, pero para propósitos de que practiques, esto te sirve, ¡suerte! :D

    John Cardenas

    John Cardenas

    studenthace 4 años

    ¡Hola!

    He visto ese problema varias veces y al parecer existen muchas formas de solucionarlo. Sin embargo, a mi la que me funciono fue la que publiqué en este aporte. Espero que a ti también te pueda servir :)

Curso de API REST con Laravel

Curso de API REST con Laravel

Construye APIs REST profesionales con Laravel, aprendiendo desde la estructura básica y planificación hasta la autenticación con tokens en APIs privadas. Configura y personaliza recursos, colecciones y maneja versiones eficientemente.

Curso de API REST con Laravel
Curso de API REST con Laravel

Curso de API REST con Laravel

Construye APIs REST profesionales con Laravel, aprendiendo desde la estructura básica y planificación hasta la autenticación con tokens en APIs privadas. Configura y personaliza recursos, colecciones y maneja versiones eficientemente.