El acceso desde el origen 'https://example.com' ha sido bloqueado aunque he permitido https://example.com/

Resuelto wasilikoslow asked hace 2 años • 2 respuestas

Tengo una aplicación creada con React, Node.js y Socket.io.
Implementé el backend de Node en heroku y el frontend en Netlify.


Sé que los errores de CORS están relacionados con el servidor, pero no importa lo que agregue, simplemente no puede pasar por ese error en la imagen a continuación.
También agregué un script proxy al paquete.json de React como "proxy": "https://googledocs-clone-sbayrak.herokuapp.com/"

error

Y aquí está mi server.jsarchivo;

const mongoose = require('mongoose');
const Document = require('./Document');
const dotenv = require('dotenv');
const path = require('path');
const express = require('express');
const http = require('http');
const socketio = require('socket.io');
dotenv.config();

const app = express();
app.use(cors());
const server = http.createServer(app);
const io = socketio(server, {
  cors: {
    origin: 'https://googledocs-clone-sbayrak.netlify.app/',
    methods: ['GET', 'POST'],
  },
});

app.get('/', (req, res) => {
  res.status(200).send('hello!!');
});

const connectDB = async () => {
  try {
    const connect = await mongoose.connect(process.env.MONGODB_URI, {
      useUnifiedTopology: true,
      useNewUrlParser: true,
    });

    console.log('MongoDB Connected...');
  } catch (error) {
    console.error(`Error : ${error.message}`);
    process.exit(1);
  }
};

connectDB();


let defaultValue = '';

const findOrCreateDocument = async (id) => {
  if (id === null) return;

  const document = await Document.findById({ _id: id });

  if (document) return document;

  const result = await Document.create({ _id: id, data: defaultValue });
  return result;
};
io.on('connection', (socket) => {
  socket.on('get-document', async (documentId) => {
    const document = await findOrCreateDocument(documentId);
    socket.join(documentId);
    socket.emit('load-document', document.data);
    socket.on('send-changes', (delta) => {
      socket.broadcast.to(documentId).emit('receive-changes', delta);
    });

    socket.on('save-document', async (data) => {
      await Document.findByIdAndUpdate(documentId, { data });
    });
  });
  console.log('connected');
});

server.listen(process.env.PORT || 5000, () =>
  console.log(`Server has started.`)
);

y aquí es donde hago la solicitud desde el frontend;

import Quill from 'quill';
import 'quill/dist/quill.snow.css';
import { useParams } from 'react-router-dom';
import { io } from 'socket.io-client';

const SAVE_INTERVAL_MS = 2000;
 

const TextEditor = () => {
  const [socket, setSocket] = useState();
  const [quill, setQuill] = useState();
  const { id: documentId } = useParams();

  useEffect(() => {
    const s = io('https://googledocs-clone-sbayrak.herokuapp.com/');
    setSocket(s);
     

    return () => {
      s.disconnect();
    };
  }, []); 

 /* below other functions */
 /* below other functions */
 /* below other functions */
 }

wasilikoslow avatar Dec 15 '21 01:12 wasilikoslow
Aceptado

TL;DR

Los orígenes web no contienen una ruta.

En consecuencia, nohttps://googledocs-clone-sbayrak.netlify.app/ es un origen web válido. Suelta esa barra diagonal.

Más detalles sobre el problema.

No se permite barra diagonal en el valor del Originencabezado

Según el protocolo CORS (especificado en el estándar Fetch ), los navegadores nunca establecen el Originencabezado de la solicitud en un valor con una barra diagonal . Por lo tanto, si una página https://googledocs-clone-sbayrak.netlify.app/whateveremite una solicitud de origen cruzado, el Originencabezado de esa solicitud contendrá

https://googledocs-clone-sbayrak.netlify.app

sin ninguna barra diagonal.

Comparación byte a byte en el lado del servidor

Estás utilizando Socket.IO , que se basa en el paquete Node.js. corsEse paquete no establecerá nada Access-Control-Allow-Originen la respuesta si el origen de la solicitud no coincide exactamente con originel valor de su configuración CORS ( https://googledocs-clone-sbayrak.netlify.app/).

Poniendolo todo junto

Obviamente,

'https://googledocs-clone-sbayrak.netlify.app' ===
'https://googledocs-clone-sbayrak.netlify.app/'

se evalúa como false, lo que hace que el corspaquete no establezca ningún Access-Control-Allow-Originencabezado en la respuesta, lo que hace que la verificación CORS falle en su navegador, de ahí el error CORS que observó.

Ejemplo del estándar de recuperación

La sección 3.2.5 del Fetch Standard incluso proporciona un ejemplo esclarecedor de este error,

Access-Control-Allow-Origin: https://rabbit.invalid/

y explica por qué hace que falle la verificación CORS:

Un origen serializado no tiene barra diagonal.

jub0bs avatar Dec 16 '2021 08:12 jub0bs