Esta página aplica-se ao Apigee e ao Apigee Hybrid.
Veja a documentação do
Apigee Edge.
O quê
A partilha de recursos de origem cruzada (CORS) é um mecanismo padrão que permite que as chamadas JavaScript XMLHttpRequest (XHR) executadas numa página Web interajam com recursos de domínios não originais. A CORS é uma solução implementada frequentemente para a política de mesma origem aplicada por todos os navegadores.
Por exemplo, se fizer uma chamada XHR à API Twitter a partir de código JavaScript executado no seu navegador, a chamada falha. Isto deve-se ao facto de o domínio que publica a página no seu navegador não ser o mesmo que o domínio que publica a API Twitter. O CORS oferece uma solução para este problema ao permitir que os servidores optem por partilhar recursos de origem cruzada.
Esta política CORS permite que os clientes do Apigee definam políticas CORS para APIs consumidas por aplicações Web.
Esta política é uma política padrão e pode ser implementada em qualquer tipo de ambiente. Para obter informações sobre os tipos de políticas e a disponibilidade com cada tipo de ambiente, consulte Tipos de políticas.
<CORS>
elemento
Define a política de CORS.
Valor predefinido | Consulte o separador Política predefinida abaixo |
Obrigatório? | Obrigatória |
Tipo | Objeto complexo |
Elemento principal | N/A |
Elementos subordinados |
<AllowCredentials> <AllowHeaders> <AllowMethods> <AllowOrigins> <DisplayName> <ExposeHeaders> <GeneratePreflightResponse> <IgnoreUnresolvedVariables> <MaxAge> |
O elemento <CORS>
usa a seguinte sintaxe:
Sintaxe
O elemento <CORS>
usa a seguinte sintaxe:
<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME"> <DisplayName>DISPLAY_NAME</DisplayName> <AllowOrigins>[{message template}|URL|URL, URL, ...|{context-variable}|{flow-variable}|*]</AllowOrigins> <AllowMethods>[GET, PUT, POST, DELETE, ...|*]</AllowMethods> <AllowHeaders>[origin, x-requested-with, accept, content-type, ...]</AllowHeaders> <ExposeHeaders>[X-CUSTOM-HEADER-A, X-CUSTOM-HEADER-B, ... | *]</ExposeHeaders> <MaxAge>[integer|-1]</MaxAge> <AllowCredentials>[false|true]</AllowCredentials> <GeneratePreflightResponse>[false|true]</GeneratePreflightResponse> <IgnoreUnresolvedVariables>[false|true]</IgnoreUnresolvedVariables> </CORS>
Política predefinida
O exemplo seguinte mostra as predefinições quando adiciona a política CORS ao seu fluxo na IU do Edge:
<CORS continueOnError="false" enabled="true" name="add-cors"> <DisplayName>Add CORS</DisplayName> <AllowOrigins>{request.header.origin}</AllowOrigins> <AllowMethods>GET, PUT, POST, DELETE</AllowMethods> <AllowHeaders>origin, x-requested-with, accept, content-type</AllowHeaders> <ExposeHeaders>*</ExposeHeaders> <MaxAge>3628800</MaxAge> <AllowCredentials>false</AllowCredentials> <GeneratePreflightResponse>true</GeneratePreflightResponse> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </CORS>
Quando insere uma nova política CORS
na IU do Apigee, o modelo contém marcadores
para todas as operações possíveis. Normalmente, seleciona as operações que quer realizar com esta política e remove os restantes elementos secundários. Por exemplo, se quiser especificar
os métodos HTTP permitidos para aceder ao recurso, use o elemento <AllowMethods>
e remova os outros elementos subordinados da política para a tornar mais legível.
Este elemento tem os seguintes atributos comuns a todas as políticas:
Atributo | Predefinição | Obrigatório? | Descrição |
---|---|---|---|
name |
N/A | Obrigatório |
O nome interno da política. O valor do atributo Opcionalmente, use o elemento |
continueOnError |
falso | Opcional | Definido como false para devolver um erro quando uma política falha. Este comportamento é o esperado para a maioria das políticas. Definido como true para que a execução do fluxo continue mesmo depois de uma política falhar. Veja também:
|
enabled |
verdadeiro | Opcional | Defina como true para aplicar a política. Defina como false para desativar a política. A política não é aplicada, mesmo que permaneça anexada a um fluxo. |
async |
falso | Descontinuado | Este atributo foi descontinuado. |
Cada um dos elementos secundários é descrito nas secções que se seguem.
Exemplos
São fornecidos exemplos para todos os elementos secundários nas secções seguintes.
Referência de elemento secundário
Esta secção descreve os elementos subordinados de <CORS>
.
<AllowCredentials>
Indica se o autor da chamada tem autorização para enviar o pedido real (não o preflight) através de credenciais. Traduz-se no cabeçalho Access-Control-Allow-Credentials
.
Valor predefinido | Se não for especificado, Access-Control-Allow-Credentials não é definido. |
Obrigatório? | Opcional |
Tipo | Booleano |
Elemento principal |
<CORS>
|
Elementos subordinados | Nenhum |
O elemento <AllowCredentials>
usa a seguinte sintaxe:
Sintaxe
<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME"> <AllowOrigins>[{message template}|URL|URL, URL, ...|{context-variable}|{flow-variable}|*]</AllowOrigins> <AllowCredentials>[false|true]</AllowCredentials> </CORS>
Exemplo
Este exemplo define o cabeçalho Access-Control-Allow-Credentials
como false
.
Ou seja, o autor da chamada não tem autorização para enviar o pedido real (não o pedido prévio)
com credenciais.
<CORS continueOnError="false" enabled="true" name="add-cors"> <AllowOrigins>{request.header.origin}</AllowOrigins> <AllowCredentials>false</AllowCredentials> </CORS>
<AllowHeaders>
Lista de cabeçalhos HTTP que podem ser usados quando pede o recurso.
Serializado para o cabeçalho Access-Control-Allow-Headers
.
Valor predefinido | Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers |
Obrigatório? | Opcional |
Tipo | String, com suporte de modelo de mensagem* |
Elemento principal |
<CORS>
|
Elementos subordinados | Nenhum |
* Para mais informações, consulte O que é um modelo de mensagem?
O elemento <AllowHeaders>
usa a seguinte sintaxe:
Sintaxe
<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME"> <AllowOrigins>[{message template}|URL|URL, URL, ...|{context-variable}|{flow-variable}|*]</AllowOrigins> <AllowHeaders>[origin, x-requested-with, accept, content-type, ...]</AllowHeaders> </CORS>
Exemplo
Este exemplo especifica os cabeçalhos HTTP que podem ser usados ao solicitar o recurso.
<CORS continueOnError="false" enabled="true" name="add-cors"> <AllowOrigins>{request.header.origin}</AllowOrigins> <AllowHeaders>origin, x-requested-with, accept, content-type</AllowHeaders> </CORS>
<AllowMethods>
Lista de métodos HTTP permitidos para aceder ao recurso. O conteúdo vai ser
serializado no cabeçalho
Access-Control-Allow-Methods
.
Valor predefinido | GET, POST, HEAD, OPTIONS |
Obrigatório? | Opcional |
Tipo | String, com suporte de modelo de mensagem* |
Elemento principal |
<CORS>
|
Elementos subordinados | Nenhum |
* Para mais informações, consulte O que é um modelo de mensagem?
O elemento <AllowMethods>
usa a seguinte sintaxe:
Sintaxe
<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME"> <AllowOrigins>[{message template}|URL|URL, URL, ...|{context-variable}|{flow-variable}|*]</AllowOrigins> <AllowMethods>[GET, PUT, POST, DELETE, ...|*]</AllowMethods> </CORS>
Exemplo:
Lista
Neste exemplo, são especificados os métodos HTTP que têm permissão para acessar o recurso.
<CORS continueOnError="false" enabled="true" name="add-cors"> <AllowOrigins>{request.header.origin}</AllowOrigins> <AllowMethods>GET, PUT, POST, DELETE</AllowMethods> </CORS>
Exemplo:
Wildcard
Este exemplo especifica que todos os métodos HTTP têm permissão para acessar o recurso.
<CORS continueOnError="false" enabled="true" name="add-cors"> <AllowOrigins>{request.header.origin}</AllowOrigins> <AllowMethods>*</AllowMethods> </CORS>
<AllowOrigins>
Uma lista de origens que têm autorização para aceder ao recurso. Use um asterisco (*
)
para permitir o acesso a um recurso a partir de qualquer origem. Caso contrário, forneça uma lista de permissões
de origens separadas por vírgulas. Se for encontrada uma correspondência, o valor de saída
Access-Control-Allow-Origin
é definido como a origem fornecida pelo cliente.
Valor predefinido | N/A |
Obrigatório? | Obrigatória |
Tipo | String, com suporte de modelo de mensagem* |
Elemento principal |
<CORS>
|
Elementos subordinados | Nenhum |
* Para mais informações, consulte O que é um modelo de mensagem?
O elemento <AllowOrigins>
usa a seguinte sintaxe:
Sintaxe
<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME"> <AllowOrigins>[{message template}|URL|URL, URL, ...|{context-variable}|{flow-variable}|*]</AllowOrigins> </CORS>
Exemplo:
URL único
Este exemplo especifica uma única origem de URL que tem autorização para aceder ao recurso.
<CORS continueOnError="false" enabled="true" name="add-cors"> <AllowOrigins>https://www.w3.org</AllowOrigins> </CORS>
Exemplo:
vários URLs
Este exemplo especifica várias origens que têm autorização para aceder ao recurso.
<CORS continueOnError="false" enabled="true" name="add-cors"> <AllowOrigins>https://www.w3.org, https://www.apache.org</AllowOrigins> </CORS>
Exemplo:
Variável de contexto
Neste exemplo, especificamos uma variável de contexto que representa uma ou mais origens com permissão para acessar o recurso.
<CORS continueOnError="false" enabled="true" name="add-cors"> <AllowOrigins>{origins.list}</AllowOrigins> </CORS>
Exemplo:
Variável de fluxo
Este exemplo especifica uma variável de fluxo que representa uma origem com autorização para aceder ao recurso.
<CORS continueOnError="false" enabled="true" name="add-cors"> <AllowOrigins>{request.header.origin}</AllowOrigins> </CORS>
Exemplo:
Wildcard
Este exemplo especifica que todas as origens têm permissão para acessar o recurso.
<CORS continueOnError="false" enabled="true" name="add-cors"> <AllowOrigins>*</AllowOrigins> </CORS>
<DisplayName>
Use em conjunto com o atributo name
para etiquetar a política no editor de proxy da IU de gestão com um nome diferente e mais natural.
O elemento <DisplayName>
é comum a todas as políticas.
Valor predefinido | N/A |
Obrigatório? | Opcional. Se omitir <DisplayName> , é usado o valor do atributo name da política. |
Tipo | String |
Elemento principal | <PolicyElement> |
Elementos subordinados | Nenhum |
O elemento <DisplayName>
usa a seguinte sintaxe:
Sintaxe
<PolicyElement> <DisplayName>POLICY_DISPLAY_NAME</DisplayName> ... </PolicyElement>
Exemplo
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
O elemento <DisplayName>
não tem atributos nem elementos subordinados.
<ExposeHeaders>
Uma lista de cabeçalhos HTTP aos quais os navegadores têm autorização para aceder ou um asterisco (*
)
para permitir todos os cabeçalhos HTTP.
Serializado no cabeçalho Access-Control-Expose-Headers
.
Valor predefinido | Se não for especificado, Access-Control-Expose-Headers não é definido. Os cabeçalhos não simples não são expostos por predefinição. |
Obrigatório? | Opcional |
Tipo | String, com suporte de modelo de mensagem* |
Elemento principal |
<CORS>
|
Elementos subordinados | Nenhum |
* Para mais informações, consulte O que é um modelo de mensagem?
O elemento <ExposeHeaders>
usa a seguinte sintaxe:
Sintaxe
<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME"> <AllowOrigins>[{message template}|URL|URL, URL, ...|{context-variable}|{flow-variable}|*]</AllowOrigins> <ExposeHeaders>[X-CUSTOM-HEADER-A, X-CUSTOM-HEADER-B, ... | *]</ExposeHeaders> </CORS>
Exemplo
Este exemplo especifica que os navegadores podem aceder a todos os cabeçalhos HTTP.
<CORS continueOnError="false" enabled="true" name="add-cors"> <AllowOrigins>{request.header.origin}</AllowOrigins> <ExposeHeaders>*</ExposeHeaders> </CORS>
<GeneratePreflightResponse>
Indique se a política deve gerar e devolver a resposta de verificação prévia de CORS.
Se false
, não é enviada nenhuma resposta. Em vez disso, são preenchidas as seguintes variáveis de fluxo:
cross_origin_resource_sharing.allow.credentials
cross_origin_resource_sharing.allow.headers
cross_origin_resource_sharing.allow.methods
cross_origin_resource_sharing.allow.origin
cross_origin_resource_sharing.allow.origins.list
cross_origin_resource_sharing.expose.headers
cross_origin_resource_sharing.max.age
cross_origin_resource_sharing.preflight.accepted
cross_origin_resource_sharing.request.headers
cross_origin_resource_sharing.request.method
cross_origin_resource_sharing.request.origin
cross_origin_resource_sharing.request.type
Valor predefinido | true |
Obrigatório? | Opcional |
Tipo | Booleano |
Elemento principal |
<CORS>
|
Elementos subordinados | Nenhum |
O elemento <GeneratePreflightResponse>
usa a seguinte sintaxe:
Sintaxe
<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME"> <GeneratePreflightResponse>[false|true]</GeneratePreflightResponse> <GeneratePreflightResponse>[false|true]</GeneratePreflightResponse> </CORS>
Exemplo
Este exemplo especifica que a política precisa gerar e retornar a resposta de simulação do CORS.
<CORS continueOnError="false" enabled="true" name="add-cors"> <AllowOrigins>{request.header.origin}</AllowOrigins> <GeneratePreflightResponse>true</GeneratePreflightResponse> </CORS>
<IgnoreUnresolvedVariables>
Determina se o processamento é interrompido quando é encontrada uma variável não resolvida.
Definido como true
para ignorar as variáveis não resolvidas e continuar o processamento;
caso contrário, false
.
Valor predefinido | true |
Obrigatório? | Opcional |
Tipo | Booleano |
Elemento principal |
<CORS>
|
Elementos subordinados | Nenhum |
O elemento <IgnoreUnresolvedVariables>
usa a seguinte sintaxe:
Sintaxe
<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME"> <AllowOrigins>[{message template}|URL|URL, URL, ...|{context-variable}|{flow-variable}|*]</AllowOrigins> <IgnoreUnresolvedVariables>[false|true]</IgnoreUnresolvedVariables> </CORS>
Exemplo
Este exemplo especifica que o processamento continua quando é encontrada uma variável não resolvida.
<CORS continueOnError="false" enabled="true" name="add-cors"> <AllowOrigins>{request.header.origin}</AllowOrigins> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </CORS>
<MaxAge>
Especifica durante quanto tempo os resultados de um pedido de pré-voo podem ser colocados em cache em segundos.
Um valor de -1
preenche o cabeçalho Access-Control-Max-Age
com um valor de -1
, que desativa o armazenamento em cache, o que requer uma verificação de pré-voo
OPTIONS
para todas as chamadas. Isto é definido na
especificação
Access-Control-Max-Age
.
Valor predefinido | 1800 |
Obrigatório? | Opcional |
Tipo | Número inteiro |
Elemento principal |
<CORS>
|
Elementos subordinados | Nenhum |
O elemento <MaxAge>
usa a seguinte sintaxe:
Sintaxe
<CORS continueOnError="[false|true]" enabled="[false|true]" name="POLICY_NAME"> <AllowOrigins>[{message template}|URL|URL, URL, ...|{context-variable}|{flow-variable}|*]</AllowOrigins> <MaxAge>[integer|-1]</MaxAge> </CORS>
Exemplo:
Cache
Este exemplo especifica que os resultados de um pedido de pré-voo podem ser colocados em cache durante 3628800
segundos.
<CORS continueOnError="false" enabled="true" name="add-cors"> <AllowOrigins>{request.header.origin}</AllowOrigins> <MaxAge>3628800</MaxAge> </CORS>
Exemplo:
No cache
Este exemplo especifica que os resultados de uma solicitação de simulação não podem ser armazenados em cache.
<CORS continueOnError="false" enabled="true" name="add-cors"> <AllowOrigins>{request.header.origin}</AllowOrigins> <MaxAge>-1</MaxAge> </CORS>
Notas de utilização
OPTIONS
pedidos
Quando um pedido
OPTIONS
é recebido e processado pela política de CORS, a execução do fluxo de proxy
é transferida diretamente para o PreFlow de resposta do proxy, ignorando completamente os fluxos de pedidos e
continua a execução a partir daí. Não é necessário criar uma condição para ignorar o pedido OPTIONS no fluxo de pedidos proxy.
Nas chamadas subsequentes, quando a política CORS é executada, se o MaxAge
definido na política não tiver expirado, o fluxo continua normalmente. Durante o fluxo de resposta final, imediatamente antes de "Resposta enviada ao cliente", um passo de execução de CORS especial "CORSResponseOrErrorFlowExecution" define os cabeçalhos de resposta de CORS (Access-Control-Allow-Credentials
, Access-Control-Allow-Origin
e Access-Control-Expose-Headers
) para devolver uma resposta validada por CORS.
Códigos de erro
Nesta seção, descrevemos os códigos de falha e as mensagens de erro retornadas e as variáveis com falha definidas pela Apigee quando essa política aciona um erro. Essas informações são importantes para saber se você está desenvolvendo regras de falha para lidar com falhas. Para saber mais, consulte O que você precisa saber sobre erros de política e Como lidar com falhas.
Erros de execução
Esses erros podem ocorrer quando a política é executada.
Código de falha | Status HTTP | Causa |
---|---|---|
steps.cors.UnresolvedVariable |
500 |
Esse erro ocorrerá se uma variável especificada na política CORS:
ou |
Erros na implantação
Esses erros podem ocorrer quando você implanta um proxy que contém esta política.
Nome do erro | Causa |
---|---|
InvalidMaxAge |
MaxAge não é um número |
MissingAllowOrigins |
AllowOrigins não especificado |
InvalidHTTPMethods |
Um dos métodos em AllowMethods não é válido |
AllowHeadersSizeTooLarge |
O tamanho da string em AllowHeaders é muito grande. |
ExposeHeadersSizeTooLarge |
O tamanho da string em ExposeHeaders é muito grande. |
Variáveis de falha
Essas variáveis são definidas quando essa política aciona um erro no ambiente de execução. Para mais informações, consulte O que você precisa saber sobre erros de política.
Variáveis | Onde | Exemplo |
---|---|---|
fault.name = "FAULT_NAME" |
FAULT_NAME é o nome da falha, conforme listado na tabela Erros de ambiente de execução acima. O nome da falha é a última parte do código de falha. | fault.name Matches "UnresolveVariable" |
cors.POLICY_NAME.failed |
POLICY_NAME é o nome da política especificada pelo usuário que gerou a falha. | cors.AddCORS.failed = true |
Exemplo de resposta de erro
{ "fault":{ "detail":{ "errorcode":"steps.cors.UnresolvedVariable" }, "faultstring":"CORS[AddCORS]: unable to resolve variable wrong.var" } }
Exemplo de regra de falha
<FaultRule name="Add CORS Fault"> <Step> <Name>Add-CORSCustomUnresolvedVariableErrorResponse</Name> <Condition>(fault.name Matches "UnresolvedVariable") </Condition> </Step> <Condition>(cors.Add-CORS.failed = true) </Condition> </FaultRule>
Variáveis de fluxo
É adicionado um objeto CorsFlowInfo
FlowInfo
, que fica disponível para rastreio.
Propriedade | Tipo | Leitura/escrita | Descrição | O âmbito começa |
---|---|---|---|---|
cross_origin_resource_sharing.allow.credentials |
Booleano | Leitura/escrita | Valor de <AllowCredentials> |
Pedido de proxy |
cross_origin_resource_sharing.allow.headers |
String | Leitura/escrita | Valor de <AllowHeaders> |
Pedido de proxy |
cross_origin_resource_sharing.allow.methods |
String | Leitura/escrita | Valor de <AllowMethods> |
Pedido de proxy |
cross_origin_resource_sharing.allow.origin |
String | Leitura/escrita | A origem do pedido permitida, vazia se não estiver na lista de autorizações | Pedido de proxy |
cross_origin_resource_sharing.allow.origins.list |
String | Leitura/escrita | Valor de <AllowOrigins> |
Pedido de proxy |
cross_origin_resource_sharing.expose.headers |
String | Leitura/escrita | Valor de <ExposeHeaders> |
Pedido de proxy |
cross_origin_resource_sharing.max.age |
Número inteiro | Leitura/escrita | Valor de <MaxAge> |
Pedido de proxy |
cross_origin_resource_sharing.preflight.accepted |
Booleano | Leitura/escrita | Indica se o pedido de verificação prévia é aceite | Pedido de proxy |
cross_origin_resource_sharing.request.headers |
String | Leitura/escrita | O valor do cabeçalho Access-Control-Request-Headers do pedido |
Pedido de proxy |
cross_origin_resource_sharing.request.method |
String | Leitura/escrita | O valor do cabeçalho Access-Control-Request-Method do pedido |
Pedido de proxy |
cross_origin_resource_sharing.request.origin |
String | Leitura/escrita | Igual a request.header.origin |
Pedido de proxy |
cross_origin_resource_sharing.request.type |
String | Leitura/escrita |
Tipo de pedido CORS. Valores possíveis:
|
Pedido de proxy |