O Compartilhamento de recursos entre origens (CORS) da Adobe Experience Manager as a Cloud Service facilita que propriedades da Web que não sejam de AEM façam chamadas do lado do cliente baseadas em navegador para APIs do GraphQL AEM AEM e outros recursos Headless.
As configurações a seguir são exemplos. Ajuste-os para se alinharem aos requisitos do seu projeto.
O CORS é necessário para conexões baseadas em navegador com APIs do AEM GraphQL, quando o cliente que se conecta ao AEM AEM NÃO é atendido a partir da mesma origem (também conhecida como host ou domínio) que o.
Tipo de cliente | Aplicativo de página única (SPA) | Componente Web/JS | Móvel | Servidor para servidor |
---|---|---|---|---|
Requer a configuração do CORS | ✔ | ✔ | ✘ | ✘ |
A ativação do CORS no serviço de Autor do AEM é diferente dos serviços de Publicação do AEM e Visualização do AEM. O serviço de Autor do AEM requer que uma configuração OSGi seja adicionada à pasta de modo de execução do serviço de Autor do AEM e não usa uma configuração do Dispatcher.
A fábrica de configuração OSGi CORS do AEM define os critérios de permissão para aceitar solicitações HTTP CORS.
O cliente se conecta ao | Autor do AEM | AEM Publish | Visualização do AEM |
---|---|---|---|
Requer a configuração OSGi do CORS | ✔ | ✘ | ✘ |
O exemplo abaixo define uma configuração OSGi para AEM Author (../config.author/..
), portanto, só está ativo no serviço AEM Author.
As principais propriedades de configuração são:
alloworigin
e/ou alloworiginregexp
especifica as origens em que o cliente que se conecta à web AEM é executado.allowedpaths
especifica os padrões de caminho de URL permitidos nas origens especificadas.
/graphql/execute.json.*
/content/experience-fragments/.*
supportedmethods
especifica os métodos HTTP permitidos para as solicitações do CORS. Para oferecer suporte a consultas persistentes do AEM GraphQL (e Fragmentos de experiência), adicione GET
.supportedheaders
inclui "Authorization"
como solicitações ao AEM Author devem ser autorizadas.supportscredentials
está definida como true
como solicitação ao AEM Author deve ser autorizada.Saiba mais sobre a configuração OSGi do CORS.
O exemplo a seguir suporta o uso de consultas persistentes de AEM GraphQL no AEM Author. Para usar consultas do GraphQL definidas pelo cliente, adicione um URL de endpoint do GraphQL em allowedpaths
e POST
para supportedmethods
.
/ui.config/src/main/content/jcr_root/apps/wknd-examples/osgiconfig/config.author/com.adobe.granite.cors.impl.CORSPolicyImpl~graphql.cfg.json
{
"alloworigin":[
"https://spa.external.com/"
],
"alloworiginregexp":[
],
"allowedpaths": [
"/graphql/execute.json.*",
"/content/experience-fragments/.*"
],
"supportedheaders": [
"Origin",
"Accept",
"X-Requested-With",
"Content-Type",
"Access-Control-Request-Method",
"Access-Control-Request-Headers",
"Authorization"
],
"supportedmethods":[
"GET",
"HEAD",
"POST"
],
"maxage:Integer": 1800,
"supportscredentials": true,
"exposedheaders":[ "" ]
}
A ativação do CORS nos serviços de publicação (e pré-visualização) do AEM é diferente do serviço de Autor do AEM. O serviço de Publicação do AEM requer que uma configuração do Dispatcher AEM seja adicionada à configuração do Dispatcher de publicação do AEM. AEM Publish não usa um Configuração OSGi.
Ao configurar o CORS na publicação do AEM, verifique:
Origin
O cabeçalho da solicitação HTTP não pode ser enviado para o serviço de publicação AEM, removendo o Origin
(se adicionado anteriormente) do cabeçalho do projeto AEM Dispatcher clientheaders.any
arquivo. Qualquer Access-Control-
os cabeçalhos devem ser removidos do clientheaders.any
arquivos e o Dispatcher os gerencia, não o serviço de publicação do AEM.O Dispatcher do serviço de Publicação (e Pré-visualização) do AEM deve ser configurado para ser compatível com o CORS.
O cliente se conecta ao | Autor do AEM | AEM Publish | Visualização do AEM |
---|---|---|---|
Requer a configuração do CORS do Dispatcher | ✘ | ✔ | ✔ |
Abra o arquivo de configuração do vhost para o serviço de Publicação do AEM, em seu projeto de configuração do Dispatcher, normalmente em dispatcher/src/conf.d/available_vhosts/<example>.vhost
Copie o conteúdo de <IfDefine ENABLE_CORS>...</IfDefine>
abaixo, no arquivo de configuração do vhost habilitado.
<VirtualHost *:80>
...
<IfModule mod_headers.c>
################## Start of CORS configuration ##################
SetEnvIfExpr "req_novary('Origin') == ''" CORSType=none CORSProcessing=false
SetEnvIfExpr "req_novary('Origin') != ''" CORSType=cors CORSProcessing=true CORSTrusted=false
SetEnvIfExpr "req_novary('Access-Control-Request-Method') == '' && %{REQUEST_METHOD} == 'OPTIONS' && req_novary('Origin') != ''" CORSType=invalidpreflight CORSProcessing=false
SetEnvIfExpr "req_novary('Access-Control-Request-Method') != '' && %{REQUEST_METHOD} == 'OPTIONS' && req_novary('Origin') != ''" CORSType=preflight CORSProcessing=true CORSTrusted=false
SetEnvIfExpr "req_novary('Origin') -strcmatch '%{REQUEST_SCHEME}://%{HTTP_HOST}*'" CORSType=samedomain CORSProcessing=false
# For requests that require CORS processing, check if the Origin can be trusted
SetEnvIfExpr "%{HTTP_HOST} =~ /(.*)/ " ParsedHost=$1
################## Adapt regex to match CORS origin(s) for your environment
SetEnvIfExpr "env('CORSProcessing') == 'true' && req_novary('Origin') =~ m#(https://.*\.your-domain\.tld(d+?lang=pt-BR)?$)#" CORSTrusted=true
# Extract the Origin header
SetEnvIfNoCase ^Origin$ ^(.*)$ CORSTrustedOrigin=$1
# Flush If already set
Header unset Access-Control-Allow-Origin
Header unset Access-Control-Allow-Credentials
# Trusted
Header always set Access-Control-Allow-Credentials "true" "expr=reqenv('CORSTrusted') == 'true'"
Header always set Access-Control-Allow-Origin "%{CORSTrustedOrigin}e" "expr=reqenv('CORSTrusted') == 'true'"
Header always set Access-Control-Allow-Methods "GET" "expr=reqenv('CORSTrusted') == 'true'"
Header always set Access-Control-Max-Age 1800 "expr=reqenv('CORSTrusted') == 'true'"
Header always set Access-Control-Allow-Headers "Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers" "expr=reqenv('CORSTrusted') == 'true'"
# Non-CORS or Not Trusted
Header unset Access-Control-Allow-Credentials "expr=reqenv('CORSProcessing') == 'false' || reqenv('CORSTrusted') == 'false'"
Header unset Access-Control-Allow-Origin "expr=reqenv('CORSProcessing') == 'false' || reqenv('CORSTrusted') == 'false'"
Header unset Access-Control-Allow-Methods "expr=reqenv('CORSProcessing') == 'false' || reqenv('CORSTrusted') == 'false'"
Header unset Access-Control-Max-Age "expr=reqenv('CORSProcessing') == 'false' || reqenv('CORSTrusted') == 'false'"
# Always vary on origin, even if its not there.
Header merge Vary Origin
# CORS - send 204 for CORS requests which are not trusted
RewriteCond expr "reqenv('CORSProcessing') == 'true' && reqenv('CORSTrusted') == 'false'"
RewriteRule "^(.*)" - [R=204,L]
# Remove Origin before sending to AEM Publish if this configuration handles the CORS
RequestHeader unset Origin "expr=reqenv('CORSTrusted') == 'true'"
################## End of CORS configuration ##################
</IfModule>
...
</VirtualHost>
Faça a correspondência das Origens desejadas que acessam seu serviço de Publicação de AEM, atualizando a expressão regular na linha abaixo. Se várias origens forem necessárias, duplique esta linha e atualize para cada origem/padrão de origem.
SetEnvIfExpr "env('CORSProcessing') == 'true' && req_novary('Origin') =~ m#(https://.*.your-domain.tld(:\d+)?$)#" CORSTrusted=true
Por exemplo, para habilitar o acesso ao CORS a partir das origens:
https://example.com
http://localhost
Substitua a linha pelas duas linhas a seguir:
SetEnvIfExpr "env('CORSProcessing') == 'true' && req_novary('Origin') =~ m#(https://.*\.example\.com$)#" CORSTrusted=true
SetEnvIfExpr "env('CORSProcessing') == 'true' && req_novary('Origin') =~ m#(http://localhost(:\d+)?$)#" CORSTrusted=true