Uso compartido de recursos de origen cruzado (CORS)
El Intercambio de Recursos de Origen Cruzado (CORS) de Adobe Experience Manager as a Cloud Service AEM AEM facilita que las propiedades web que no son de origen realicen llamadas del lado del cliente basadas en el explorador a las API de GraphQL AEM que se utilizan para el y a otros recursos sin encabezado.
Requisito CORS
AEM CORS es necesario para las conexiones basadas en el explorador a las API de GraphQL AEM AEM, cuando el cliente que se conecta a la NO se proporciona desde el mismo origen (también conocido como host o dominio) que el que se proporciona a las API de.
AEM Author
AEM AEM La activación de CORS en el servicio de autor de es diferente de la activación de los servicios de previsualización de Publish AEM y de. AEM AEM El servicio de creación de requiere que se agregue una configuración OSGi a la carpeta de modo de ejecución del servicio de creación de OSGi y no utiliza una configuración de Dispatcher.
Configuración de OSGi
AEM El generador de configuración OSGi de CORS de define los criterios de permiso para aceptar solicitudes HTTP CORS.
AEM AEM El ejemplo siguiente define una configuración OSGi para el autor de la (../config.author/..
), de modo que solo está activa en el servicio de autor de la.
Las propiedades de configuración clave son:
-
AEM
alloworigin
y/oalloworiginregexp
especifican los orígenes en los que se ejecuta la conexión del cliente a la web de la. -
allowedpaths
especifica los patrones de ruta de acceso de dirección URL permitidos a partir de los orígenes especificados.- AEM Para admitir consultas persistentes de GraphQL, agregue el siguiente patrón:
/graphql/execute.json.*
- Para admitir fragmentos de experiencias, agregue el siguiente patrón:
/content/experience-fragments/.*
- AEM Para admitir consultas persistentes de GraphQL, agregue el siguiente patrón:
-
supportedmethods
especifica los métodos HTTP permitidos para las solicitudes CORS. AEM Para admitir consultas persistentes (y fragmentos de experiencias) de GraphQL de, agregueGET
-
AEM
supportedheaders
incluye"Authorization"
como solicitudes a Autor de la que deben ser autorizadas. -
AEM
supportscredentials
se ha establecido entrue
, ya que la solicitud a Autor de la debe estar autorizada.
Más información sobre la configuración OSGi de CORS.
AEM El siguiente ejemplo admite el uso de consultas persistentes de GraphQL AEM en el uso de la de autor. Para usar consultas GraphQL definidas por el cliente, agregue una dirección URL de extremo GraphQL en allowedpaths
y POST
a 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":[ "" ]
}
Ejemplo de configuración de OSGi
Publicación de AEM
AEM La activación de CORS en los servicios de Publish AEM (y Vista previa) de la es diferente al servicio de creación de formularios. AEM El servicio de Publish AEM requiere que se agregue una configuración de Dispatcher AEM de a la configuración de Dispatcher de Publish. AEM Publish no usa una configuración OSGi.
AEM Al configurar CORS en Publish, asegúrese de lo siguiente:
- AEM El encabezado de solicitud HTTP
Origin
no se puede enviar al servicio de Publish AEM; para ello, elimine el encabezadoOrigin
(si se agregó anteriormente) del archivoclientheaders.any
del proyecto de Dispatcher de la. Los encabezadosAccess-Control-
se deben eliminar del archivoclientheaders.any
y Dispatcher AEM los administra, no el servicio de Publish, en lugar de los que se utilizan para administrar el servicio de identidad de los usuarios. - AEM Si tiene alguna configuración OSGi de CORS habilitada en su servicio de Publish en la red de servicio, debe eliminarla y migrar sus configuraciones a la configuración de vhost de Dispatcher que se describe a continuación.
Configuración de Dispatcher
AEM El Dispatcher del servicio Publish (y previsualización) debe configurarse para admitir CORS.
Definición de encabezados CORS en vhost
-
AEM Abra el archivo de configuración de vhost para el servicio de Publish de, en el proyecto de configuración de Dispatcher, normalmente en
dispatcher/src/conf.d/available_vhosts/<example>.vhost
-
Copie el contenido del bloque
<IfDefine ENABLE_CORS>...</IfDefine>
siguiente en el archivo de configuración vhost habilitado.code language-none h-17 <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 'http://%{HTTP_HOST}*'" CORSType=samedomain CORSProcessing=false SetEnvIfExpr "req_novary('Origin') -strcmatch 'https://%{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=es)?$)#" 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>
-
AEM Haga coincidir los orígenes deseados para acceder a su servicio de Publish de la manera que desee actualizando la expresión regular en la línea de abajo. Si se necesitan varios orígenes, duplique esta línea y actualice para cada origen/patrón de origen.
code language-none SetEnvIfExpr "env('CORSProcessing') == 'true' && req_novary('Origin') =~ m#(https://.*.your-domain.tld(:\d+)?$)#" CORSTrusted=true
-
Por ejemplo, para habilitar el acceso CORS desde orígenes:
- Cualquier subdominio de
https://example.com
- Cualquier puerto de
http://localhost
Sustituya la línea por las dos líneas siguientes:
code language-none 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
- Cualquier subdominio de
-