Trabajar con CORS

El uso compartido de recursos de origen cruzado (CORS) es un protocolo basado en cabecera que permite a JavaScript realizar solicitudes en su nombre para acceder a recursos de otro dominio. Configure Cloud Gate para que active CORS y aplique los valores 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 el delincuente JavaScript (plantado en un sitio por atacantes, por ejemplo, mediante el uso de 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 se pueden realizar correctamente si actualmente tiene una sesión activa con esos sitios. CORS estipula que si un servidor no responde con el juego correcto de cabeceras de respuesta, el explorador no permite que JavaScript vea (o acceda) la respuesta.

Una solicitud de CORS se dispara cuando JavaScript intenta una solicitud HTTP en una diferente:
  • dominio: por ejemplo, site1.oraclecloud.com llama a oracle.com
  • subdominio: por ejemplo, site1.oraclecloud.com llama a site7.oraclecloud.com
  • puerto: 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 CORS se presenta en dos formas: una solicitud CORS simple o una solicitud CORS de verificación previa.

Solicitud simple de CORS

Se realiza una solicitud CORS simple si la solicitud JavaScript en un recurso de 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 de comprobación previa de CORS

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

La solicitud de CORS de comprobación previa prueba si la solicitud real se puede enviar a ese recurso mediante la inclusión de cabeceras HTTP específicas en la solicitud que contiene los datos que han provocado que se dispare el flujo de solicitud de comprobación previa. En otras palabras, si la solicitud HTTP JavaScript ha especificado algún método/cabeceras en la solicitud HTTP que necesitaban una solicitud CORS de comprobación previa, la solicitud CORS de comprobación previa 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 CORS de Cloud Gate 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.

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

cloudGateCorsAllowedOrigins

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

El valor por defecto es una matriz vacía.

Cada solicitud de CORS especifica su origen u 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 CORS adecuadas a su respuesta.

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

Valores CORS permitidos en la plantilla de entrada:
  • Entrada: * | <PROTOCOL>"://"<HOST><PORT>
  • <PROTOCOL>: * | http | https
  • <HOST>: [<DOMAIN>.]<DOMAIN>
  • <DOMAIN>: < any alphanumerical character, * and - >
    • Un valor <DOMAIN> no puede empezar ni terminar con un valor '-'.
    • 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 lo es.
    • Utilizar https://tools.ietf.org/html/rfc1123 como referencia
  • <PORT>: <EMPTY> | ":" <PORT_VALUE>
  • <PORT_VALUE>: * | <numerical characters>. <PORT_VALUE> debe estar en el rango de 1 a 65535.
Ejemplos:
  • Coincidir 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 soportar escenarios en los que el explorador envía un origen "nulo". Esta configuración se debe configurar para: true.

El valor por defecto es false.

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

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

cloudGateCorsMaxAge

Un número entero que especifica el número de segundos que el cliente (explorador) puede almacenar en caché una respuesta de CORS de comprobación previa.

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 por defecto 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 tener 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 soportar CORS. Si el valor isCorsAllowed del documento de política de nivel web se ha configurado en true, Cloud Gate permitiría la comprobación previa de solicitudes de CORS a través de aplicaciones protegidas.
Nota

La versión mínima de Cloud Gate necesaria es la 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 la compatibilidad con CORS.
    • Reinicie o vuelva a cargar manualmente el servidor NGINX.
    • Espere hasta que caduque la caché de configuración de CORS de Cloud Gate. Por defecto, puede tardar hasta una hora.
  3. A continuación se muestran las cabeceras de respuesta de CORS que devuelve Cloud Gate en función de 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 simples y de verificación previa

Descripció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 CORS por la presencia de la cabecera de solicitud de origen.
  2. Si es necesario (por ejemplo, caducidad de la 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 a través del 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 forma parte de la respuesta y contiene la cabecera "Origen". Esto ocurre incluso para solicitudes que no sean de CORS.
    2. Si cloudGateCorsEnabled es false, el procesamiento se para 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 borran 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 en 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 las define el servidor de aplicaciones ascendente.

Verificar previamente flujo de trabajo de solicitud de CORS

  1. La solicitud se identifica como solicitud CORS por la presencia de la cabecera de solicitud de origen.
  2. Si es necesario (por ejemplo, caducidad de la 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 de CORS de comprobación previa 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 implanten CORS.

    Si cloudGateCorsEnabled es false, la antigua configuración de política de nivel web isCorsAllowed se sigue respetando, justo más adelante 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 Vary Response forma parte de la respuesta y que contiene la cabecera "Origin". Esto ocurre incluso para las solicitudes nonCORS.
    2. Si cloudGateCorsEnabled es false, el procesamiento se para 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 borran 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 construye su valor de la siguiente manera:
      • Si la cabecera Permitir respuesta está incluida 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 en un valor mayor que cero, la cabecera de respuesta Access-Control-Max-Age se agrega y se configura en el valor de antigüedad máxima. Si el valor cloudGateCorsMaxAge es cero o menos, 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 Respuestas de comprobación previa.
  6. Cloud Gate devuelve su respuesta.