Trabalhando com CORS

O Compartilhamento de Recursos entre Origens (CORS) é um protocolo baseado em cabeçalho que permite ao JavaScript fazer solicitações em seu nome para acessar recursos em outro domínio. Configure o Cloud Gate para que ele ative CORS e imponha definições de CORS para o Cloud Gate em execução no App Gateway ou em domínios de identidades do IAM.

O CORS ajuda a impedir que o JavaScript desonesto (plantado em um site por invasores, por exemplo, usando anúncios) faça solicitações AJAX em seu nome. Solicitações fraudulentas do AJAX podem retirar dinheiro do seu banco ou fazer compras em seu nome em um site de compras on-line. Essas solicitações podem ser bem-sucedidas se você tiver atualmente uma sessão ativa com esses sites. CORS estipula que se um servidor não responder com o conjunto correto de Cabeçalhos de Resposta, o navegador não permitirá que o JavaScript veja (ou acesse) a resposta.

Uma solicitação CORS é acionada quando o JavaScript tenta uma Solicitação HTTP para outro:
  • domínio - por exemplo, site1.oraclecloud.com chama oracle.com
  • subdomínio - por exemplo, site1.oraclecloud.com chama site7.oraclecloud.com
  • porta - por exemplo, site1.oraclecloud.com chama site1.oraclecloud.com:3030
  • protocolo - por exemplo, https://site1.oraclecloud.com chama http://site1.oraclecloud.com

Uma Solicitação CORS é apresentada em duas formas: uma Solicitação CORS Simples ou uma Solicitação CORS Preflight.

Solicitação CORS Simples

Uma Solicitação CORS Simples será executada se a Solicitação JavaScript de um recurso em outro domínio tiver as seguintes características:
  • O método é um dos seguintes:
    • GET
    • POST
    • HEAD
  • Os Cabeçalhos HTTP permitidos que podem ser adicionados manualmente à Solicitação CORS Simples são:
    • Accept
    • Accept-Language
    • Content-Language
    • Content-Type
    • DPR
    • Downlink
    • Save-Data
    • Viewport-Width
    • Width
  • O Content-Type, se definido, deve ser:
    • application/x-www-form-urlencoded
    • multipart/form-data
    • text/plain

Solicitação CORS Preflight

Se a solicitação JavaScript não atender às características de uma Solicitação de CORS Simples, uma Solicitação de CORS de Preflight será enviada ao recurso localizado no outro domínio.

A Solicitação CORS de Preflight testa se a solicitação real pode ser enviada para esse recurso, incluindo cabeçalhos HTTP específicos na solicitação que contém os dados que resultaram no acionamento do fluxo de solicitação de pré-flight. Em outras palavras, se a Solicitação HTTP JavaScript especificou algum método/cabeçalhos na Solicitação HTTP que exigiu uma Solicitação CORS de Preflight, a Solicitação CORS de Preflight consultará o recurso para esse método/cabeçalhos para ver se o recurso aceita essa solicitação de domínio cruzado.

Propriedades e Atributos de Configuração do CORS do Cloud Gate

A tabela a seguir descreve as propriedades e os atributos de configuração do CORS do Cloud Gate.
Propriedade CORS Descrição
cloudGateCorsEnabled

Propriedade booleana para ativar o suporte CORS do Cloud Gate para a tenancy. Esta definição deve ser configurada para: true.

A ativação do flag cloudGateCorsEnabled no cloudGateCorsSettings ativa o recurso em seu tenant e os domínios de identidade imporão a lista de origens permitidas definidas no cloudGateCorsAllowedOrigins e uma lista global de origens permitidas.

O padrão é false.

Melhores práticas. Configure cloudGateCorsAllowedOrigins ao mesmo tempo. Se esta propriedade for deixada vazia, todas as Solicitações CORS falharão.

cloudGateCorsAllowedOrigins

A propriedade é uma Matriz de String que contém a lista de Origens CORS permitidas.

O padrão é uma matriz vazia.

Cada Solicitação CORS especifica sua origem ou origem no Cabeçalho de Solicitação de Origem. O valor do Cabeçalho de origem corresponde a esta lista.

Se a Origem for correspondida, o Cloud Gate adicionará os Cabeçalhos CORS apropriados à sua resposta.

Se a Origem não for correspondida, o Cloud Gate não retornará nenhum Cabeçalho de Resposta CORS - fazendo com que a resposta seja rejeitada pelo browser.

Valores CORS permitidos no modelo de entrada:
  • Entrada: * | <PROTOCOL>"://"<HOST><PORT>
  • <PROTOCOL>: * | http | https
  • <HOST>: [<DOMAIN>.]<DOMAIN>
  • <DOMAIN>: < any alphanumerical character, * and - >
    • Um <DOMAIN> não pode começar nem terminar com um '-'.
    • Qualquer <DOMAIN> pode ser um curinga. O curinga deve incluir o domínio inteiro. Por exemplo, www.*.com é válido, mas www.*racle.com não é.
    • Usar https://tools.ietf.org/html/rfc1123 como referência
  • <PORT>: <EMPTY> | ":" <PORT_VALUE>
  • <PORT_VALUE>: * | <numerical characters>. <PORT_VALUE> deve estar na faixa de 1 a 65535.
Exemplos:
  • Corresponder tudo: *
  • Correspondência exata: https://www.acme.com, https://www.acme.com:4443
  • Host/protocolo exato, qualquer porta: https://www.google.com:*
  • Host/porta exato, qualquer protocolo (HTTP ou HTTPS): *://www.acme.com, *://www.acme.com:8080
  • Subdomínio, protocolo exato, sem porta: https://*.oraclecloud.com
  • Qualquer domínio, protocolo exato, sem porta: https://*
cloudGateCorsAllowNullOrigin

Propriedade booleana para suportar cenários em que o navegador envia uma Origem "nula". Esta definição deve ser configurada para: true.

O padrão é false.

Uma Origem "nula" é enviada se a Solicitação CORS for proveniente de um arquivo no computador de um usuário ou se um servidor for redirecionado para outro servidor em resposta a uma Solicitação CORS. O navegador passa uma Origem "nula" quando considera a Origem "manchada". Para aumentar a segurança, por padrão, Origens "nulas" não são permitidas.

Algumas Origens "nulas" são válidas. Os aplicativos que utilizam o Log-in de Fluxo do Browser do OpenID Connect (OIDC) do domínio de identidades verão Origens "nulas" enviadas para seus nós do Cloud Gate. Quando o Cloud Gate redireciona para o domínio de identidades, autoriza o ponto final a iniciar o Log-in do Browser do OIDC e quando o domínio de identidades redireciona a solicitação de volta para o Cloud Gate, a Origem será "nula".

cloudGateCorsMaxAge

Um inteiro que especifica o número de segundos que o cliente (navegador) pode armazenar em cache uma Resposta CORS Preflight.

cloudGateCorsExposedHeaders

A propriedade é um Array de String que lista os Cabeçalhos de Resposta que podem ser adicionados ao Cabeçalho de Resposta Access-Control-Expose-Headers.

O padrão é uma matriz vazia.

Configurando Definições de CORS do Cloud Gate em Domínios de Identidades

O Cloud Gate requer que você configure as seguintes definições em domínios de identidades para suporte de CORS (Compartilhamento de Recursos entre Origens).

Antes de iniciar a configuração, certifique-se de ter a versão correta do Cloud Gate. Versões anteriores do módulo do Cloud Gate não forneciam suporte para CORS. Foi deixado para Protected Applications para suportar CORS. Se a definição isCorsAllowed no documento de Política da Camada Web fosse configurada como true, o Cloud Gate permitiria Solicitações CORS de pré-voo por meio de Aplicativos Protegidos.
Observação

A versão mínima do Cloud Gate necessária é a 21.1.2.

Use o ponto final /admin/v1/Settings/Settings para configurar as definições de CORS. A solicitação é uma operação patch. Consulte Atualizar uma Definição para obter mais informações.

  1. Use este payload de amostra como modelo para criar o corpo da solicitação. Salve o payload em um arquivo, por exemplo, /tmp/cors-settings.json. Edite o arquivo com os detalhes da sua implantação.
    Amostra de payload.
       {
       "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" ]
        }
        }]
       }
    Solicitação cURL de amostra.
       # $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. Execute uma das seguintes ações para ativar o suporte a CORS.
    • Reinicie ou recarregue manualmente o servidor NGINX.
    • Aguarde até que o cache de definições CORS do Cloud Gate expire. Isso pode levar até uma hora, por padrão.
  3. A seguir estão os cabeçalhos de resposta CORS que o Cloud Gate retorna, dependendo da solicitação 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

Workflows de Solicitação CORS Simples e de Pré-Viagem

Visão geral dos workflows de requisição CORS (Cross-Origin Resource Sharing).

Workflow da Solicitação CORS Simples

  1. A Solicitação é identificada como uma Solicitação CORS pela presença do Cabeçalho da Solicitação de Origem.
  2. Se necessário (por exemplo, expiração do cache), as definições CORS do Cloud Gate serão submetidas a download de domínios de identidades no serviço IAM.
  3. O Cloud Gate processa a solicitação - rejeitando a solicitação ou permitindo-a pelo servidor de aplicativos upstream.
  4. Antes de uma resposta ser retornada, o Cloud Gate impõe CORS conforme definido pelas definições de CORS do Cloud Gate.
    1. O Cloud Gate sempre garante que o Cabeçalho de Resposta Variado faça parte da Resposta - e contenha o Cabeçalho "Origem". Isso ocorre mesmo para solicitações não CORS.
    2. Se cloudGateCorsEnabled for false, o processamento será interrompido aqui. A Resposta é retornada como está.
    3. O Cloud Gate verifica se a Origem é permitida - usando a lista configurada de Origens Permitidas.

      Se a Origem não for permitida, todos os Cabeçalhos de Resposta CORS suportados serão removidos da Resposta e o processamento será encerrado.

    4. O Cabeçalho de Resposta Access-Control-Allow-Origin é adicionado e configurado para o valor do Cabeçalho de Solicitação de Origem.
    5. O Cabeçalho de Resposta Access-Control-Allow-Credentials é adicionado e configurado para true.
    6. O Access-Control-Expose-Headers é configurado para a interseção entre o valor cloudGateCorsExposedHeaders e a lista de Cabeçalhos que estão sendo retornados na Resposta.
    7. As opções Access-Control-Allow-Methods, Access-Control-Allow-Headers e Access-Control-Max-Age Response Headers foram removidas da Resposta.
  5. O Cloud Gate retorna sua Resposta.
Nota

O Cloud Gate substitui os Cabeçalhos Access-Control-Allow-Origin e Access-Control-Allow-Credentials Response se definidos pelo servidor de aplicativos de upstream.

Fluxo de trabalho Solicitação CORS de pré-voo

  1. A Solicitação é identificada como uma Solicitação CORS pela presença do Cabeçalho da Solicitação de Origem.
  2. Se necessário (por exemplo, expiração do cache), as definições CORS do Cloud Gate serão submetidas a download de domínios de identidades no serviço IAM.
  3. A Solicitação é identificada como uma Solicitação CORS Preflight pelo Método OPTIONS e pelo Cabeçalho da Solicitação Access-Control-Request-Method - além do Cabeçalho da Solicitação de Origem.
  4. Se cloudGateCorsEnabled for true, a Solicitação poderá passar para o servidor de aplicativos upstream - para permitir que os aplicativos implementem CORS.

    Se cloudGateCorsEnabled for false, a definição antiga da Política da Camada Web isCorsAllowed ainda será respeitada - apenas mais tarde no processamento da solicitação.

  5. Antes de a resposta ser retornada do Cloud Gate, o CORS é imposto conforme definido pelas definições de CORS do Cloud Gate.
    1. O Cloud Gate sempre garante que o Cabeçalho de Resposta Variado faça parte da Resposta - e contenha o Cabeçalho "Origem". Isso ocorre mesmo para Solicitações nonCORS.
    2. Se cloudGateCorsEnabled for false, o processamento será interrompido aqui. A Resposta é retornada como está.
    3. O Cloud Gate verifica se a Origem é permitida - usando a lista configurada de Origens Permitidas.

      Se a Origem não for permitida, todos os Cabeçalhos de Resposta CORS suportados serão removidos da Resposta e o processamento será encerrado.

    4. O Cabeçalho de Resposta Access-Control-Allow-Origin é adicionado e configurado para o valor do Cabeçalho de Solicitação de Origem.
    5. O Cabeçalho de Resposta Access-Control-Allow-Credentials é adicionado e configurado para true.
    6. Se o servidor de aplicativos de upstream não tiver adicionado o Cabeçalho de Resposta Access-Control-Allow-Methods, o Cloud Gate construirá seu valor da seguinte forma:
      • Se o Cabeçalho Permitir Resposta estiver incluído na Resposta, o Cloud Gate usará seu valor.
      • Se o Cabeçalho da Solicitação Access-Control-Request-Method for encontrado na Solicitação, o Cloud Gate usará seu valor.
    7. Se o servidor de aplicativos de upstream não tiver adicionado o Cabeçalho de Resposta Access-Control-Allow-Headers, o Cloud Gate usará o valor do Cabeçalho de Solicitação Access-Control-Request-Headers na Solicitação, se ele estiver presente.
    8. Se cloudGateCorsMaxAge estiver configurado para um valor maior que zero, o Cabeçalho de Resposta Access-Control-Max-Age será adicionado e configurado para o valor de idade máxima. Se o valor cloudGateCorsMaxAge for zero ou menor, nenhuma ação será tomada para o Cabeçalho de Resposta Access-Control-Max-Age.
    9. O Cabeçalho de Resposta Access-Control-Expose-Headers foi removido. Não se aplica a respostas de pré-voo.
  6. O Cloud Gate retorna sua Resposta.