Descripción del uso compartido de recursos de origen cruzado (CORS)
El uso compartido de recursos de origen cruzado de Adobe Experience Manager (CORS) facilita las propiedades web que no son de AEM para hacer llamadas del lado del cliente a AEM, tanto autenticadas como no autenticadas, para recuperar contenido o interactuar directamente con AEM.
La configuración OSGI que se describe en este documento es suficiente para lograr lo siguiente:
- Uso compartido de recursos de un solo origen en AEM Publish
- Acceso de CORS a AEM Author
Si se requiere acceso de CORS desde varios orígenes en AEM Publish, consulte esta documentación.
Configuración OSGi de la política del uso compartido de recursos de origen cruzado de Adobe Granite
Las configuraciones de CORS se administran como fábricas de configuración OSGi en AEM, y cada directiva se representa como una instancia de la fábrica.
http://<host>:<port>/system/console/configMgr > Adobe Granite Cross Origin Resource Sharing Policy
Adobe Granite Cross-Origin Resource Sharing Policy (com.adobe.granite.cors.impl.CORSPolicyImpl
)
Selección de la política
Se selecciona una política comparando lo siguiente:
Allowed Origin
con el encabezado de solicitudOrigin
- y
Allowed Paths
con la ruta de solicitud.
Se utiliza la primera política que coincida con estos valores. Si no se encuentra ninguna, se denegará cualquier solicitud CORS.
Si no se configura ninguna directiva, tampoco se responde a las solicitudes CORS, ya que el controlador está deshabilitado y, por lo tanto, se deniega de forma efectiva, siempre que ningún otro módulo del servidor responda a CORS.
Propiedades de la política
Orígenes permitidos
"alloworigin" <origin> | *
- Lista de parámetros
origin
que especifican los URI que pueden acceder al recurso. En el caso de las solicitudes sin credenciales, el servidor puede especificar * como comodín, permitiendo así que cualquier origen acceda al recurso. No se recomienda usarAllow-Origin: *
en producción, ya que permite que cada sitio web extranjero (es decir, atacante) realice solicitudes que los exploradores prohíben estrictamente sin CORS.
Orígenes permitidos (regexp)
"alloworiginregexp" <regexp>
- Lista de expresiones regulares
regexp
que especifican los URI que pueden acceder al recurso. Las expresiones regulares pueden dar lugar a coincidencias no deseadas si no se crean con cuidado, lo que permitiría a un atacante utilizar un nombre de dominio personalizado que también coincidiría con la política. En general, se recomienda tener directivas separadas para cada nombre de host de origen específico, utilizandoalloworigin
, aunque eso implique configurar repetidamente las demás propiedades de la política. Los distintos orígenes tienden a tener ciclos de vida y requisitos diferentes, por lo que se benefician de una separación clara.
Rutas permitidas
"allowedpaths" <regexp>
- Lista de expresiones regulares
regexp
que especifican las rutas de recursos para las que se aplica la directiva.
Encabezados expuestos
"exposedheaders" <header>
- Lista de parámetros de encabezado que indican los encabezados de respuesta a los que los exploradores pueden acceder. En el caso de las solicitudes CORS (no de comprobación preliminar), si no están vacías, estos valores se copian en el encabezado de respuesta
Access-Control-Expose-Headers
. A continuación, los valores de la lista (nombres de encabezado) pasan a ser accesibles para el explorador; sin ello, el explorador no puede leer esos encabezados.
Tiempo máximo
"maxage" <seconds>
- Un parámetro
seconds
que indica cuánto tiempo se pueden almacenar en caché los resultados de una solicitud de comprobación preliminar.
Encabezados compatibles
"supportedheaders" <header>
- Lista de parámetros
header
que indican qué encabezados de petición HTTP se pueden usar al realizar la solicitud real.
Métodos permitidos
"supportedmethods"
- Lista de parámetros de método que indica qué métodos HTTP se pueden utilizar al realizar la solicitud real.
Credenciales compatibles
"supportscredentials" <boolean>
- Un
boolean
que indica si la respuesta a la solicitud se puede exponer en el explorador. Cuando se utiliza como parte de una respuesta a una solicitud de comprobación preliminar, indica si la solicitud real se puede realizar o no usando credenciales.
Ejemplos de configuraciones
El sitio 1 es un escenario básico, de acceso anónimo y de solo lectura, en el que el contenido se consume a través de solicitudes GET:
{
"supportscredentials":false,
"exposedheaders":[
""
],
"supportedmethods":[
"GET",
"HEAD"
],
"alloworigin":[
"http://127.0.0.1:3000",
"https://site1.com"
],
"maxage:Integer": 1800,
"alloworiginregexp":[
"http://localhost:.*"
"https://.*\.site1\.com"
],
"allowedpaths":[
"/content/_cq_graphql/site1/endpoint.json",
"/graphql/execute.json.*",
"/content/site1/.*"
],
"supportedheaders":[
"Origin",
"Accept",
"X-Requested-With",
"Content-Type",
"Access-Control-Request-Method",
"Access-Control-Request-Headers"
]
}
El sitio 2 es más complejo y requiere solicitudes autorizadas y mutantes (POST, PUT, DELETE):
{
"supportscredentials":true,
"exposedheaders":[
""
],
"supportedmethods":[
"GET",
"HEAD"
"POST",
"DELETE",
"PUT"
],
"alloworigin":[
"http://127.0.0.1:3000",
"https://site2.com"
],
"maxage:Integer": 1800,
"alloworiginregexp":[
"http://localhost:.*"
"https://.*\.site2\.com"
],
"allowedpaths":[
"/content/site2/.*",
"/libs/granite/csrf/token.json",
],
"supportedheaders":[
"Origin",
"Accept",
"X-Requested-With",
"Content-Type",
"Access-Control-Request-Method",
"Access-Control-Request-Headers",
"Authorization",
"CSRF-Token"
]
}
Problemas y configuración del almacenamiento en caché de Dispatcher dispatcher-caching-concerns-and-configuration
A partir de Dispatcher 4.1.1+, los encabezados de respuesta se pueden almacenar en caché. Esto permite almacenar en caché los encabezados CORS junto con los recursos solicitados por CORS, siempre y cuando la solicitud sea anónima.
Por lo general, se pueden aplicar las mismas consideraciones para almacenar en caché el contenido en Dispatcher a los encabezados de respuesta CORS en caché en Dispatcher. La siguiente tabla define cuándo se pueden almacenar en caché los encabezados CORS (y, por lo tanto, las solicitudes CORS).
Permitir encabezados de solicitud CORS
Para permitir que los encabezados de petición HTTP necesarios pasen a AEM para el procesamiento, deben estar permitidos en la configuración /clientheaders
de Dispatcher.
/clientheaders {
...
"Origin"
"Access-Control-Request-Method"
"Access-Control-Request-Headers"
}
Almacenamiento en caché de los encabezados de respuesta CORS
Para permitir el almacenamiento en caché y el servicio de encabezados CORS en contenido almacenado en caché, añada la siguiente configuración /cache /headers al archivo dispatcher.any
de AEM Publish.
/publishfarm {
...
/cache {
...
# CORS HTTP response headers
# https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#the_http_response_headers
/headers {
...
"Access-Control-Allow-Origin"
"Access-Control-Expose-Headers"
"Access-Control-Max-Age"
"Access-Control-Allow-Credentials"
"Access-Control-Allow-Methods"
"Access-Control-Allow-Headers"
}
...
}
...
}
Recuerde reiniciar la aplicación del servidor web después de realizar cambios en el archivo dispatcher.any
.
Es probable que se necesite borrar la caché por completo para garantizar que los encabezados se almacenen correctamente en la caché en la siguiente solicitud después de una actualización de la configuración /cache/headers
.
Solución de problemas CORS
El registro está disponible en com.adobe.granite.cors
:
- habilite
DEBUG
para ver los detalles de por qué se denegó la solicitud CORS - habilite
TRACE
para ver los detalles de todas las solicitudes que pasan por el controlador CORS
Sugerencias:
-
Vuelva a crear manualmente las solicitudes XHR utilizando curl, pero asegúrese de copiar todos los encabezados y detalles, ya que cada uno puede marcar la diferencia; algunas consolas de explorador permiten copiar el comando curl
-
Verifique si el controlador CORS ha denegado la solicitud y no la autenticación, el filtro de token CSRF, los filtros de Dispatcher u otras capas de seguridad
- Si el controlador CORS responde con 200, pero el encabezado
Access-Control-Allow-Origin
no aparece en la respuesta, revise los registros para ver si hay denegaciones en DEBUG encom.adobe.granite.cors
- Si el controlador CORS responde con 200, pero el encabezado
-
Si el almacenamiento en caché de Dispatcher de CORS solicitudes está habilitado
- Asegúrese de que la configuración
/cache/headers
se aplique adispatcher.any
y de que el servidor web se reinicie correctamente - Asegúrese de que la caché se haya borrado correctamente después de cualquier cambio en la configuración OSGi o Dispatcher.any.
- Asegúrese de que la configuración
-
si es necesario, compruebe la presencia de credenciales de autenticación en la solicitud.