Trabajar con CORS

El uso compartido de recursos entre orígenes (CORS) es un protocolo basado en cabeceras que permite a JavaScript realizar solicitudes en su nombre para acceder a recursos en otro dominio. Configure Cloud Gate para que active CORS y aplique la configuración de CORS para Cloud Gate que se ejecuta en el gateway de aplicación o los dominios de identidad de IAM.

CORS ayuda a evitar que JavaScript (plantado en un sitio por atacantes, por ejemplo, mediante anuncios) realice solicitudes AJAX en su nombre. Las solicitudes fraudulentas de AJAX podrían retirar dinero de su banco o realizar compras a su nombre en un sitio de compras en línea. Estas solicitudes podrían tener éxito si actualmente tiene una sesión activa con esos sitios. CORS estipula que si un servidor no responde con el conjunto correcto de encabezados de respuesta, el navegador no permite que JavaScript vea (o acceda) a la respuesta.

Una solicitud CORS se dispara cuando JavaScript intenta realizar una solicitud HTTP en otra diferente:
  • dominio: por ejemplo, site1.oraclecloud.com llama a oracle.com
  • subdominio: por ejemplo, site1.oraclecloud.com llama a site7.oraclecloud.com
  • port: por ejemplo, site1.oraclecloud.com llama a site1.oraclecloud.com:3030
  • protocolo: por ejemplo, https://site1.oraclecloud.com llama a http://site1.oraclecloud.com

Una solicitud de CORS viene en dos formas: una solicitud de CORS simple o una solicitud de CORS de Preflight.

Solicitud CORS simple

Se realiza una solicitud CORS simple si la solicitud JavaScript de un recurso en otro dominio tiene las siguientes características:
  • El método es uno de los siguientes:
    • GET
    • POST
    • HEAD
  • Las cabeceras HTTP permitidas que se pueden agregar manualmente a la solicitud CORS simple son:
    • Accept
    • Accept-Language
    • Content-Language
    • Content-Type
    • DPR
    • Downlink
    • Save-Data
    • Viewport-Width
    • Width
  • Si se define, Content-Type debe ser:
    • application/x-www-form-urlencoded
    • multipart/form-data
    • text/plain

Solicitud CORS de Preflight

Si la solicitud JavaScript no cumple las características de una solicitud CORS simple, se envía una solicitud CORS de Preflight al recurso ubicado en el otro dominio.

La solicitud CORS de Preflight prueba si la solicitud real se puede enviar a ese recurso mediante la inclusión de cabeceras HTTP específicas en la solicitud que contienen los datos que han provocado que se dispare el flujo de solicitud de preflight. En otras palabras, si la solicitud HTTP JavaScript especificó algunos métodos/cabeceras en la solicitud HTTP que necesitaban una solicitud CORS de Preflight, la solicitud CORS de Preflight consulta al recurso para esos métodos/cabeceras para ver si el recurso acepta dicha solicitud entre dominios.

Propiedades y atributos de configuración de CORS de Cloud Gate

En la siguiente tabla, se describen las propiedades y los atributos de configuración de CORS de Cloud Gate.
Propiedad de CORS Descripción
cloudGateCorsEnabled

Propiedad booleana para activar el soporte de Cloud Gate CORS para el arrendamiento. Este valor se debe configurar en: true.

Al activar el indicador cloudGateCorsEnabled en cloudGateCorsSettings, se activa la función en el inquilino, y los dominios de identidad aplicarán la lista de orígenes permitidos definida en cloudGateCorsAllowedOrigins y una lista global de orígenes permitidos.

El valor por defecto es false.

Mejor práctica. Configure cloudGateCorsAllowedOrigins al mismo tiempo. Si esta propiedad se deja vacía, todas las solicitudes de CORS fallan.

cloudGateCorsAllowedOrigins

La propiedad es una matriz de cadenas que contiene la lista de orígenes de CORS permitidos.

El valor predeterminado es una matriz vacía.

Cada solicitud de CORS especifica su origen en la cabecera de solicitud de origen. El valor de la cabecera de origen coincide con esta lista.

Si el origen coincide, Cloud Gate agrega las cabeceras de CORS adecuadas a su respuesta.

Si el origen no coincide, Cloud Gate no devuelve ninguna cabecera de respuesta de CORS, lo que hace que el explorador rechace la respuesta.

Valores de CORS permitidos en la plantilla de entrada:
  • Entrada: * | <PROTOCOL>"://"<HOST><PORT>
  • <PROTOCOL>: * | http | https
  • <HOST>: [<DOMAIN>.]<DOMAIN>
  • <DOMAIN>: < any alphanumerical character, * and - >
    • Un <DOMAIN> no puede empezar ni terminar con un '-'.
    • Cualquier <DOMAIN> puede ser un comodín. El comodín debe incluir todo el dominio. Por ejemplo, www.*.com es válido, pero www.*racle.com no.
    • Utilizar https://tools.ietf.org/html/rfc1123 como referencia
  • <PORT>: <EMPTY> | ":" <PORT_VALUE>
  • <PORT_VALUE>: * | <numerical characters>. <PORT_VALUE> debe estar en el rango 1 - 65535.
Ejemplos:
  • Coincide con todo: *
  • Coincidencia exacta: https://www.acme.com, https://www.acme.com:4443
  • Host/protocolo exacto, cualquier puerto: https://www.google.com:*
  • Host/puerto exacto, cualquier protocolo (HTTP o HTTPS): *://www.acme.com, *://www.acme.com:8080
  • Subdominio, protocolo exacto, sin puerto: https://*.oraclecloud.com
  • Cualquier dominio, protocolo exacto, sin puerto: https://*
cloudGateCorsAllowNullOrigin

Propiedad booleana para admitir escenarios en los que el explorador envía un origen "nulo". Este valor se debe configurar en: true.

El valor por defecto es false.

Se envía un origen "nulo" si la solicitud CORS proviene de un archivo en el equipo de un usuario o si un servidor redirige a otro servidor en respuesta a una solicitud CORS. El navegador pasa un Origen "nulo" cuando considera que el Origen está "manchado". Para aumentar la seguridad, por defecto, no se permiten orígenes "nulos".

Algunos orígenes "nulos" son válidos. Las aplicaciones que aprovechen el inicio de sesión de flujo de explorador de Connect (OIDC) del dominio de identidad OpenID verán orígenes "nulos" enviados a sus nodos de Cloud Gate. Cuando Cloud Gate se redirige al punto final de autorización del dominio de identidad para iniciar la conexión del explorador de OIDC y cuando el dominio de identidad redirige la solicitud de nuevo a Cloud Gate, el origen será "nulo".

cloudGateCorsMaxAge

Entero que especifica el número de segundos que el cliente (explorador) puede almacenar en caché una respuesta CORS de preflight.

cloudGateCorsExposedHeaders

La propiedad es una matriz de cadenas que muestra las cabeceras de respuesta que se pueden agregar a la cabecera de respuesta Access-Control-Expose-Headers.

El valor predeterminado es una matriz vacía.

Configuración de valores de CORS de Cloud Gate en dominios de identidad

Cloud Gate requiere que configure los siguientes valores en los dominios de identidad para el soporte de uso compartido de recursos de origen cruzado (CORS).

Antes de iniciar la configuración, asegúrese de que tiene la versión correcta de Cloud Gate. Las versiones anteriores del módulo Cloud Gate no proporcionaban soporte para CORS. Se dejó a Aplicaciones Protegidas para apoyar CORS. Si el valor isCorsAllowed del documento de política de nivel web se ha configurado en true, Cloud Gate permitiría realizar el vuelo previo de solicitudes CORS a través de aplicaciones protegidas.
Nota

La versión mínima de Cloud Gate necesaria es 21.1.2.

Utilice el punto final /admin/v1/Settings/Settings para configurar los valores de CORS. La solicitud es una operación patch. Consulte Actualización de un valor para obtener más información.

  1. Utilice esta carga útil de ejemplo como plantilla para crear el cuerpo de la solicitud. Guarde la carga útil en un archivo, por ejemplo, /tmp/cors-settings.json. Edite el archivo con los detalles del despliegue.
    Carga útil de muestra.
       {
       "schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
       "Operations": [{
        "op": "replace",
        "path": "cloudGateCorsSettings",
        "value": {
        "cloudGateCorsEnabled": true,
        "cloudGateCorsAllowNullOrigin": true,
        "cloudGateCorsAllowedOrigins": [ "https://app.my-server.com:8080", "https://*:*" ],
        "cloudGateCorsMaxAge: 60,
        "cloudGateCorsExposedHeaders": [ "x-custom-header", "x-my-app-header" ]
        }
        }]
       }
    Ejemplo de solicitud de cURL.
       # $AT is a previously generated Admin Access Token.
       # https://<IdentityDomainID>.identity.oraclecloud.com is an example URL 
       $ curl -X PATCH -H "Content-Type: application/scim+json" -H "Accept: application/json" -H "Authorization: Bearer $AT" "https://<domainURL>/admin/v1/Settings/Settings" --data @"/tmp/cors-settings.json"
  2. Realice una de las siguientes acciones para activar el soporte de CORS.
    • Reinicie o vuelva a cargar manualmente el servidor NGINX.
    • Espere hasta que caduque la caché de configuración de CORS de Cloud Gate. Esto puede tardar hasta una hora, por defecto.
  3. Las siguientes son las cabeceras de respuesta de CORS que devuelve Cloud Gate según la solicitud de CORS.
    • Access-Control-Allow-Origin
    • Access-Control-Allow-Methods
    • Access-Control-Allow-Headers
    • Access-Control-Allow-Credentials
    • Access-Control-Max-Age
    • Access-Control-Expose-Headers

Flujos de Trabajo de Solicitud de CORS Sencillos y Previos

Visión general de los flujos de trabajo de solicitud de uso compartido de recursos de origen cruzado (CORS).

Flujo de Trabajo de Solicitud de CORS Simple

  1. La solicitud se identifica como solicitud de CORS por la presencia de la cabecera de solicitud de origen.
  2. Si es necesario (por ejemplo, caducidad de caché), la configuración de CORS de Cloud Gate se descarga de los dominios de identidad en IAM.
  3. Cloud Gate procesa la solicitud, ya sea rechazando la solicitud o permitiéndola pasar al servidor de aplicaciones ascendente.
  4. Antes de que se devuelva una respuesta, Cloud Gate aplica CORS según lo definido por la configuración de CORS de Cloud Gate.
    1. Cloud Gate siempre garantiza que la cabecera de respuesta variable forme parte de la respuesta y contenga la cabecera "Origin". Esto ocurre incluso para solicitudes que no son de CORS.
    2. Si cloudGateCorsEnabled es false, el procesamiento se detiene aquí. La Respuesta se devuelve tal cual.
    3. Cloud Gate verifica que el origen está permitido, mediante la lista configurada de orígenes permitidos.

      Si no se permite el origen, todas las cabeceras de respuesta de CORS soportadas se eliminan de la respuesta y finaliza el procesamiento.

    4. La cabecera de respuesta Access-Control-Allow-Origin se agrega y configura al valor de la cabecera de solicitud de origen.
    5. La cabecera de respuesta Access-Control-Allow-Credentials se agrega y configura en true.
    6. Access-Control-Expose-Headers se configura para la intersección entre el valor cloudGateCorsExposedHeaders y la lista de cabeceras que se devuelven en la respuesta.
    7. Los valores Access-Control-Allow-Methods, Access-Control-Allow-Headers y Access-Control-Max-Age Response Headers se eliminan de la respuesta.
  5. Cloud Gate devuelve su respuesta.
Nota

Cloud Gate sobrescribe las cabeceras Access-Control-Allow-Origin y Access-Control-Allow-Credentials Response si lo define el servidor de aplicaciones ascendente.

Flujo de trabajo de solicitud de CORS de Preflight

  1. La solicitud se identifica como solicitud de CORS por la presencia de la cabecera de solicitud de origen.
  2. Si es necesario (por ejemplo, caducidad de caché), la configuración de CORS de Cloud Gate se descarga de los dominios de identidad en IAM.
  3. La solicitud se identifica como solicitud CORS de preflight mediante el método OPTIONS y la cabecera de solicitud Access-Control-Request-Method, además de la cabecera de solicitud de origen.
  4. Si cloudGateCorsEnabled es true, se permite que la solicitud pase al servidor de aplicaciones ascendente para permitir que las aplicaciones implementen CORS.

    Si cloudGateCorsEnabled es false, se sigue respetando la antigua configuración de política de nivel web isCorsAllowed, justo más tarde en el procesamiento de la solicitud.

  5. Antes de que la respuesta se devuelva desde Cloud Gate, CORS se aplica según lo definido por la configuración de CORS de Cloud Gate.
    1. Cloud Gate siempre garantiza que la cabecera de respuesta variable forme parte de la respuesta y contenga la cabecera "Origin". Esto ocurre incluso para las solicitudes nonCORS.
    2. Si cloudGateCorsEnabled es false, el procesamiento se detiene aquí. La Respuesta se devuelve tal cual.
    3. Cloud Gate verifica que el origen está permitido, mediante la lista configurada de orígenes permitidos.

      Si no se permite el origen, todas las cabeceras de respuesta de CORS soportadas se eliminan de la respuesta y finaliza el procesamiento.

    4. La cabecera de respuesta Access-Control-Allow-Origin se agrega y configura al valor de la cabecera de solicitud de origen.
    5. La cabecera de respuesta Access-Control-Allow-Credentials se agrega y configura en true.
    6. Si el servidor de aplicaciones ascendente no ha agregado la cabecera de respuesta Access-Control-Allow-Methods, Cloud Gate crea su valor de la siguiente manera:
      • Si la cabecera Permitir respuesta se incluye en la respuesta, Cloud Gate utiliza su valor.
      • Si se encuentra la cabecera de solicitud Access-Control-Request-Method en la solicitud, Cloud Gate utiliza su valor.
    7. Si el servidor de aplicaciones ascendente no ha agregado la cabecera de respuesta Access-Control-Allow-Headers, Cloud Gate utiliza el valor de la cabecera de solicitud Access-Control-Request-Headers en la solicitud si está presente.
    8. Si cloudGateCorsMaxAge está configurado con un valor mayor que cero, la cabecera de respuesta Access-Control-Max-Age se agrega y se configura con el valor de antigüedad máximo. Si el valor cloudGateCorsMaxAge es cero o inferior, no se realiza ninguna acción para la cabecera de respuesta Access-Control-Max-Age.
    9. Se ha eliminado la cabecera de respuesta Access-Control-Expose-Headers. No se aplica a las respuestas de verificación previa.
  6. Cloud Gate devuelve su respuesta.