DEV Community

Cover image for Cómo solucionar el error de CORS orign en Django
Isaac Zepeda
Isaac Zepeda

Posted on

Cómo solucionar el error de CORS orign en Django

El error CORS (Cross-Origin Resource Sharing) o Intercambio de Recursos de Origen Cruzado ocurre cuando tu frontend (o cualquier otra aplicación) intenta acceder a tu API de Django desde un dominio o puerto diferente, y el servidor de la API no está configurado para permitir estas solicitudes.

Para resolver el error CORS en tu proyecto de Django, necesitas instalar el paquete django-cors-headers y configurarlo en tu archivo settings.py para permitir solicitudes desde orígenes específicos o desde todos los orígenes.

¿Qué es CORS y por qué es importante?

CORS es un mecanismo de seguridad implementado por los navegadores web para proteger a los usuarios de posibles ataques maliciosos. Sin embargo, este mecanismo también puede impedir que aplicaciones legítimas se comuniquen entre sí si no están correctamente configuradas.

En la ingeniería de software moderna, es común tener el frontend y el backend en servidores diferentes. Por ejemplo, podrías tener tu aplicación React ejecutándose en http://localhost:3000 y tu API de Django en http://localhost:8000. Sin la configuración adecuada de CORS, el navegador bloqueará las solicitudes entre estos dos orígenes por razones de seguridad.

Pasos para resolver el problema de CORS

1. Instalar django-cors-headers

Primero, necesitas instalar el paquete django-cors-headers para manejar CORS en Django. Ejecuta el siguiente comando:

pip install django-cors-headers
Enter fullscreen mode Exit fullscreen mode

También puedes agregar esta dependencia a tu archivo requirements.txt:

django-cors-headers==4.4.0
Enter fullscreen mode Exit fullscreen mode

2. Agregar django-cors-headers a las aplicaciones instaladas

Una vez instalado, agrega corsheaders a tu lista de INSTALLED_APPS en el archivo settings.py:

INSTALLED_APPS = [
    # Otras aplicaciones instaladas...
    'corsheaders',
]
Enter fullscreen mode Exit fullscreen mode

3. Agregar CorsMiddleware a Middleware

El siguiente paso es agregar CorsMiddleware a tu middleware en settings.py. Este middleware debe agregarse antes de CommonMiddleware:

MIDDLEWARE = [
    # Otros middleware...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    # Otros middleware...
]
Enter fullscreen mode Exit fullscreen mode

4. Configurar CORS en settings.py

Ahora necesitas configurar CORS para permitir solicitudes desde ciertos dominios o desde todos los dominios.

  • Para permitir todos los orígenes (no recomendado para producción):
  CORS_ALLOW_ALL_ORIGINS = True
Enter fullscreen mode Exit fullscreen mode
  • Para permitir orígenes específicos: Puedes especificar una lista de orígenes permitidos configurando la opción CORS_ALLOWED_ORIGINS. Por ejemplo, si tu frontend se ejecuta en http://localhost:3000, puedes permitir ese origen así:
  CORS_ALLOWED_ORIGINS = [
      "http://localhost:3000",
      "https://tu-dominio-de-produccion.com",
  ]
Enter fullscreen mode Exit fullscreen mode

5. Permitir encabezados CORS para cookies (opcional)

Si estás trabajando con cookies para autenticación (por ejemplo, con autenticación de sesión), también necesitas configurar lo siguiente:

CORS_ALLOW_CREDENTIALS = True
Enter fullscreen mode Exit fullscreen mode

Esto permitirá que las credenciales (como cookies, encabezados de autorización o certificados de cliente TLS) se envíen en solicitudes de origen cruzado.

6. Permitir métodos HTTP (opcional)

Por defecto, se permiten los métodos HTTP más comunes (GET, POST, PUT, PATCH, DELETE, OPTIONS). Sin embargo, si necesitas restringir o permitir otros métodos, puedes especificarlos:

CORS_ALLOW_METHODS = [
    'DELETE',
    'GET',
    'OPTIONS',
    'PATCH',
    'POST',
    'PUT',
]
Enter fullscreen mode Exit fullscreen mode

7. Permitir encabezados HTTP (opcional)

Si quieres permitir encabezados específicos en las solicitudes, puedes configurarlo así:

CORS_ALLOW_HEADERS = [
    'authorization',
    'content-type',
    'x-csrftoken',
    'accept',
    'origin',
    'user-agent',
]
Enter fullscreen mode Exit fullscreen mode

Ejemplo de configuración completa de CORS en settings.py

Aquí tienes un ejemplo de configuración con django-cors-headers agregado a la configuración:

INSTALLED_APPS = [
    # Otras aplicaciones...,
    'corsheaders',
    # Otras aplicaciones...
]

MIDDLEWARE = [
    # Otros middleware...,
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    # Otros middleware...
]

# Permitir todos los orígenes (para desarrollo)
# CORS_ALLOW_ALL_ORIGINS = True

# O, si quieres permitir orígenes específicos:
CORS_ALLOWED_ORIGINS = [
    "http://localhost:3000",  # Frontend en localhost (React/Vue/Angular)
    "https://tu-dominio-de-produccion.com",
]

# Opcional: Para permitir credenciales como cookies, encabezados de sesión
CORS_ALLOW_CREDENTIALS = True
Enter fullscreen mode Exit fullscreen mode

Reiniciar tu servidor

Después de actualizar tu settings.py, asegúrate de reiniciar tu servidor Django para que se apliquen las nuevas configuraciones de CORS.

Consideraciones de seguridad

Es importante tener en cuenta que permitir CORS desde cualquier origen (CORS_ALLOW_ALL_ORIGINS = True) puede representar un riesgo de seguridad en un entorno de producción. Siempre es mejor especificar explícitamente los orígenes permitidos utilizando CORS_ALLOWED_ORIGINS en producción.

Además, si estás utilizando CORS_ALLOW_CREDENTIALS = True, es crucial que configures cuidadosamente CORS_ALLOWED_ORIGINS y no uses CORS_ALLOW_ALL_ORIGINS = True, ya que esto podría permitir ataques de tipo CSRF (Cross-Site Request Forgery).

Conclusión

Al instalar django-cors-headers y configurar los orígenes permitidos en tu settings.py, puedes resolver el error CORS y permitir solicitudes de origen cruzado desde tu frontend a tu API de Django. Asegúrate de restringir los orígenes permitidos en producción para mejorar la seguridad.

La configuración adecuada de CORS es esencial para el desarrollo de aplicaciones web modernas, especialmente cuando se trabaja con arquitecturas de frontend y backend separados. Con estos pasos, deberías poder resolver los problemas de CORS en tu aplicación Django y permitir una comunicación fluida entre tu frontend y tu API.

Recursos adicionales

Para obtener más información sobre CORS y su implementación en Django, puedes consultar los siguientes recursos:

  1. Documentación oficial de django-cors-headers: https://github.com/adamchainz/django-cors-headers
  2. MDN Web Docs sobre CORS: https://developer.mozilla.org/es/docs/Web/HTTP/CORS
  3. Django REST framework documentation on CORS: https://www.django-rest-framework.org/topics/ajax-csrf-cors/

Top comments (0)