¿Por qué su tienda online falla en SAP Ariba y cómo PunchOut Rocket lo soluciona en silencio?

Ha configurado su tienda online de WooCommerce, Magento, nopCommerce o personalizada a la perfección. Productos, precios, proceso de compra: todo funciona. Pero entonces, un cliente empresarial importante le pide que conecte su tienda a SAP Ariba para PunchOut, y de repente todo se rompe: iFrames en blanco, sesiones cerradas, carritos de compra invisibles. Ningún mensaje de error lo explica claramente. Este artículo desglosa exactamente lo que ocurre a nivel del navegador, por qué los sitios de comercio electrónico estándar son estructuralmente incompatibles con la forma en que las plataformas de eProcurement cargan las tiendas de los proveedores, y cómo la técnica de proxy inverso de PunchOut Rocket elimina todos estos problemas automáticamente, sin tocar la configuración de su servidor.

Cómo las plataformas de eProcurement cargan las tiendas de los proveedores

Cuando un comprador que trabaja en SAP Ariba, Coupa, Jaggaer, Oracle iProcurement o cualquier sistema de adquisición empresarial similar hace clic en el botón «Comprar ahora» de un proveedor, no abandona su portal. La plataforma de adquisición abre la tienda online del proveedor dentro de un iFrame HTML incrustado directamente en su propia interfaz.

Este diseño tiene sentido desde la perspectiva del flujo de trabajo: el comprador nunca pierde el contexto dentro de su herramienta interna, las aprobaciones y las comprobaciones de presupuesto permanecen bajo la jurisdicción del sistema de adquisición, y toda la sesión —desde la navegación hasta la transferencia del carrito— está contenida dentro de una única interfaz auditable.

Lo que los equipos de compras no siempre anuncian es que este diseño de iFrame impone estrictos requisitos de seguridad a nivel de navegador en el sitio web del proveedor. Requisitos que la mayoría de las tiendas online estándar no están configuradas para cumplir, porque nunca fueron diseñadas para cargarse como subdocumentos incrustados dentro de una aplicación de terceros.

¿Qué es un iFrame? Un <iframe> es un elemento HTML que incrusta una página web dentro de otra. La página principal (el portal de compras) y la página incrustada (su tienda online) son tratadas por el navegador como orígenes completamente separados, lo que activa una serie de políticas de seguridad de origen cruzado que pueden bloquear silenciosamente el funcionamiento de su tienda.

Los dos principales modos de fallo que resultan de esta arquitectura son una violación de frame-ancestors de la Política de Seguridad de Contenido y un rechazo de cookies SameSite. Comprender ambos es esencial para entender por qué un middleware simple que enruta las solicitudes a través de un proxy inverso lo resuelve todo de una sola vez.

El error frame-ancestors explicado

Los servidores web modernos pueden instruir a los navegadores sobre qué orígenes externos tienen permiso para incrustar sus páginas dentro de un iFrame. Esta instrucción se entrega a través de una cabecera de respuesta HTTP llamada Content Security Policy, específicamente su directiva frame-ancestors.

Cuando un navegador carga una página dentro de un iFrame, comprueba la cabecera Content-Security-Policy: frame-ancestors devuelta por el servidor de la página incrustada. Si el origen del sitio incrustador no está listado en esa directiva, el navegador se niega a renderizar la página. Usted ve un iFrame en blanco. No aparece ningún mensaje de error en la tienda. El comprador simplemente no ve nada.

Lo que el servidor realmente envía: La mayoría de los proveedores de alojamiento y las guías de endurecimiento de servidores recomiendan establecer una política restrictiva de frame-ancestors como medida de seguridad contra ataques de clickjacking. Una configuración típica bloqueada se ve así: Content-Security-Policy: frame-ancestors ‘self’. Esto le dice a cada navegador que solo la propia página tiene permiso para incrustar este sitio en un iFrame. Cualquier portal de eProcurement que intente cargar su tienda obtendrá un marco en blanco.

El equivalente más antiguo es la cabecera X-Frame-Options: SAMEORIGIN o X-Frame-Options: DENY, que se comporta de forma idéntica pero con menos granularidad. Si su servidor envía cualquiera de estas sin incluir explícitamente el dominio de la plataforma de compras en la lista blanca, su sesión de PunchOut mostrará un iFrame en blanco.

Para solucionar esto manualmente sin un proxy inverso, debe identificar cada dominio de plataforma de compras que utilizan sus clientes —que puede variar por cliente— y añadir cada uno a su directiva frame-ancestors. Para un proveedor que atiende a cinco clientes diferentes a través de Ariba, Coupa y Jaggaer, esto significa mantener una configuración de servidor que liste potencialmente docenas de dominios, manteniéndola actualizada cada vez que un cliente migra de plataforma o cambia su subdominio de portal.

El impacto en el mundo real: Un iFrame en blanco durante una sesión de PunchOut no genera un ticket de soporte como lo haría un error 500. Los compradores simplemente informan de que «la tienda del proveedor no funciona» y los equipos de compras a menudo dedican horas a solucionar lo que en realidad es una única cabecera HTTP faltante en el servidor web del proveedor.

El problema de las cookies SameSite explicado

Incluso si configura correctamente frame-ancestors para permitir que el portal de compras incruste su tienda, existe un segundo problema, más insidioso: las cookies de origen cruzado están bloqueadas por defecto en todos los navegadores modernos.

Su plataforma de comercio electrónico depende en gran medida de las cookies para mantener el estado de la sesión: saber quién ha iniciado sesión, qué hay en el carrito, qué lista de precios aplicar y si un usuario está autenticado. Estas cookies son establecidas por su servidor y enviadas de vuelta al navegador con cada solicitud.

En 2020, Google Chrome (seguido rápidamente por Firefox y Edge) cambió el comportamiento predeterminado de las cookies en contextos de origen cruzado. El cambio, regido por el atributo de cookie SameSite, funciona así:

  • SameSite=Lax (predeterminado) – Cookies bloqueadas en iFrames: Cualquier cookie sin un atributo SameSite explícito es tratada como Lax por los navegadores modernos. Las cookies Lax no se envían en solicitudes de subrecursos de origen cruzado, lo que incluye los iFrames. Su tienda se abre dentro de Ariba, pero la cookie de sesión se descarta silenciosamente.
  • SameSite=None; Secure – Lo que debe configurar: Para permitir que las cookies se envíen dentro de un iFrame de origen cruzado, cada cookie de sesión y de autenticación debe llevar explícitamente tanto SameSite=None como la bandera Secure. Omitir cualquiera de los atributos hace que el navegador descarte la cookie.

La consecuencia práctica es grave: incluso cuando el iFrame se renderiza visualmente, el comprador puede aparecer como un invitado anónimo y con la sesión cerrada. La lista de precios dedicada clonada para ellos es inaccesible. El carrito no puede asociarse con su sesión. El proceso de compra se rompe por completo. La sesión de PunchOut no devuelve ningún artículo al sistema de compras.

Por qué esto es especialmente difícil de solucionar en WooCommerce y Magento: Tanto WooCommerce como Magento establecen numerosas cookies de sesión y autenticación. Muchas son establecidas por los manejadores de sesión de PHP, algunas por la propia capa de autenticación de la plataforma, y otras por plugins de terceros. No existe un único interruptor que aplique SameSite=None; Secure a todas ellas a la vez. La solución requiere cambios en la configuración de PHP a nivel de servidor, código personalizado o una combinación de ambos, y debe validarse en todos los navegadores que utilizan sus compradores.

HTTPS es innegociable: El atributo SameSite=None solo es respetado por los navegadores cuando la cookie también está marcada como Secure, lo que significa que solo puede enviarse a través de conexiones HTTPS. Si alguna parte de su tienda o configuración de servidor sirve contenido a través de HTTP, la cookie será rechazada de todos modos. Asegúrese de que todo su sitio se ejecuta bajo un certificado TLS válido.

Por qué estos errores son tan difíciles de depurar

Tanto la violación de frame-ancestors como el rechazo de cookies SameSite son silenciosos desde la perspectiva del usuario. El comprador no ve una página de error descriptiva. La tienda del proveedor puede renderizarse parcialmente. La consola de desarrollador del navegador muestra el error real, pero los compradores y los administradores de compras no abren las herramientas de desarrollo.

«El PunchOut del proveedor no funciona» es casi siempre un error de política de seguridad del navegador, invisible para los usuarios, trivial de diagnosticar con las herramientas adecuadas, pero sorprendentemente difícil de solucionar sin acceso a nivel de servidor.

Desde la perspectiva del soporte, estos problemas son particularmente costosos porque:

  • No son reproducibles de forma aislada: su tienda funciona bien cuando se visita directamente; solo falla cuando se incrusta en el dominio de un portal de compras específico.
  • Dependen de la versión del navegador: las versiones antiguas de Chrome o Firefox pueden haber sido más permisivas, lo que lleva a informes intermitentes.
  • Requieren acceso al servidor para solucionarse: un proveedor que utiliza alojamiento compartido o una plataforma gestionada puede que ni siquiera tenga permiso para establecer cabeceras de respuesta HTTP personalizadas.
  • Se multiplican con cada nuevo cliente: cada plataforma de compras tiene un dominio de portal diferente, lo que requiere un mantenimiento continuo de la lista blanca de su servidor.

La solución correcta no es parchear cada síntoma individualmente en cada tienda. La solución correcta es eliminar por completo la carga de iFrames de origen cruzado, que es exactamente lo que hace el proxy inverso de PunchOut Rocket.

Proxy inverso de PunchOut Rocket: cómo funciona

El modo de funcionamiento predeterminado y recomendado de PunchOut Rocket utiliza una arquitectura de proxy inverso para servir su tienda online durante las sesiones de PunchOut. Comprender lo que esto significa en la práctica explica por qué elimina tanto los problemas de frame-ancestors como los de SameSite en una única decisión arquitectónica.

El principio: Un proxy inverso se sitúa entre el cliente (el navegador del comprador) y el servidor de origen (su tienda online). En lugar de que el navegador cargue su tienda directamente, realiza solicitudes a la infraestructura de PunchOut Rocket, que luego obtiene el contenido de su tienda en nombre del navegador y lo devuelve como si fuera contenido propio de PunchOut Rocket.

Desde la perspectiva del navegador, toda la sesión de PunchOut —el catálogo de productos, el carrito, el flujo de pago— proviene de un único origen consistente: el dominio de PunchOut Rocket. No hay iFrame de origen cruzado. No hay cookies de terceros. La cabecera frame-ancestors es controlada por la infraestructura de PunchOut Rocket, que ya permite los portales de eProcurement. Todas las cookies se establecen y leen bajo el origen de PunchOut Rocket y se tratan como de primera parte.

Flujo de sesión con proxy inverso habilitado:

  • 1. El comprador hace clic en «PunchOut» en Ariba o Coupa: El sistema de eProcurement envía una solicitud de configuración cXML u OCI al punto final de PunchOut Rocket.
  • 2. PunchOut Rocket autentica la sesión: Se verifican las credenciales, se resuelve la identidad correcta del comprador y se genera un token de sesión seguro. PunchOut Rocket inicia sesión en su tienda online utilizando la cuenta de usuario clonada configurada para este Cliente Final.
  • 3. El proxy inverso comienza a servir su tienda: El navegador del comprador es dirigido a una URL de PunchOut Rocket. Todas las solicitudes posteriores de páginas, activos y llamadas a la API se envían a través de la infraestructura de PunchOut Rocket. La URL de su tienda nunca aparece en la barra de direcciones del navegador durante la sesión.
  • 4. Las cookies, cabeceras y activos se reescriben: PunchOut Rocket reescribe las cabeceras de respuesta y los dominios de las cookies para que todo se sirva bajo un único origen consistente. No se aplica ninguna política SameSite entre orígenes porque solo hay un origen. No se necesita una lista blanca de frame-ancestors en su servidor porque la infraestructura de PunchOut Rocket se encarga de ello.
  • 5. El comprador compra y envía el carrito: El contenido del carrito es interceptado por PunchOut Rocket, convertido al formato cXML u OCI correcto, y transmitido de vuelta al sistema de compras como una solicitud de compra correctamente estructurada.

No se requiere configuración del servidor: Con el proxy inverso habilitado, no necesita modificar ninguna cabecera HTTP, políticas de cookies o archivos de configuración del servidor en su host de comercio electrónico. La infraestructura de PunchOut Rocket gestiona toda la compatibilidad de origen cruzado en su nombre. Esto es válido independientemente de si sus clientes utilizan Ariba, Coupa, Jaggaer o cualquier otro portal.

Interferencia de plugins: qué puede romper el proxy

El proxy inverso funciona obteniendo el HTML de su tienda en tiempo real y retransmitiéndolo al navegador del comprador. Esto significa que el HTML que produce su servidor debe ser limpio y resoluble por URL: cada etiqueta de script, referencia de hoja de estilo y origen de imagen debe utilizar rutas URL estándar absolutas o relativas que PunchOut Rocket pueda reescribir correctamente.

Una clase de plugins de WordPress y WooCommerce rompe esta suposición: los plugins de minificación de HTML y optimización de activos.

El problema de la codificación Base64: Plugins como Autoptimize mejoran el rendimiento de la página concatenando y minificando archivos CSS y JavaScript. En sus configuraciones más agresivas, también incrustan el contenido concatenado como URIs de datos codificados en Base64 directamente en el HTML. En lugar de un enlace a una hoja de estilo como: <link rel=»stylesheet» href=»/wp-content/cache/autoptimize/css/autoptimize_abc123.css»>, la salida se convierte en algo como: <style>@import url(«data:text/css;base64,Ym9keXt……»)</style>.

Cuando el proxy inverso retransmite este HTML, esas URIs de datos codificadas en Base64 no tienen una URL que reescribir; son blobs opacos de contenido codificado. Cualquier activo referenciado dentro de ellas (imágenes de fondo, fuentes web, importaciones adicionales) se resuelve contra el origen incorrecto o no se carga en absoluto. El resultado es una tienda con estilos rotos, fuentes faltantes, botones invisibles y un diseño no funcional dentro del iFrame de compras.

Plugins que pueden interferir:

  • Autoptimize: Especialmente cuando «Inline and Defer CSS» o «Inline all CSS» está habilitado. El plugin completo debe deshabilitarse durante las sesiones de PunchOut.
  • WP Rocket: Las opciones «Combine CSS Files» y «Combine JavaScript Files» pueden causar problemas. Deshabilite solo las opciones de combinar/incrustar activos.
  • LiteSpeed Cache: La minificación de HTML y la configuración de combinación de CSS/JS deben deshabilitarse. El almacenamiento en caché básico de páginas no afecta el comportamiento del proxy.
  • W3 Total Cache: El modo «Minify» para CSS y JS puede producir activos codificados en línea. Deshabilite la minificación, pero conserve el almacenamiento en caché de objetos/páginas si es necesario.
  • Plugins de caché de página estándar: Los plugins que almacenan en caché páginas HTML completas sin alterar la estructura de URL de los activos son generalmente seguros.

Cómo diagnosticar un conflicto de plugins:

  1. Abra la sesión de PunchOut en un navegador y utilice Ver código fuente de la página (no el inspector de elementos de DevTools, que muestra el DOM en vivo).
  2. Busque en el HTML sin procesar la cadena data:text/css;base64, o data:application/javascript;base64,.
  3. Si se encuentra, un plugin de minificación está codificando activos en línea. Identifique qué plugin es el responsable a partir de sus comentarios de salida en el código fuente.
  4. Deshabilite ese plugin (o su función de codificación en línea) y vuelva a probar la sesión de PunchOut.

Nota de rendimiento: Deshabilitar Autoptimize o plugins similares no significa sacrificar el rendimiento del sitio para los visitantes habituales. La mayoría de los hosts y CDN modernos proporcionan multiplexación HTTP/2 que hace que la concatenación de archivos sea en gran medida innecesaria.

Deshabilitar el proxy inverso: lo que debe configurar manualmente

El proxy inverso está habilitado por defecto para todos los sitios de PunchOut Rocket y es la configuración más recomendada. Sin embargo, si el proxy inverso se deshabilita desde la Configuración Avanzada, la compatibilidad de origen cruzado pasa a ser su responsabilidad. Se aplicarán todas las restricciones de seguridad del navegador descritas en este artículo. Debe configurar lo siguiente en su propio servidor o panel de control de alojamiento:

1. Content-Security-Policy: frame-ancestors: Debe listar explícitamente cada dominio de plataforma de compras que utilicen sus clientes. La sintaxis de configuración en su servidor o archivo .htaccess debe seguir este patrón:

Content-Security-Policy: frame-ancestors ‘self’ https://*.ariba.com https://*.coupahost.com https://*.jaggaer.com;

# También añada X-Frame-Options para compatibilidad con navegadores antiguos: X-Frame-Options: ALLOW-FROM https://your-client-portal.ariba.com

Tenga en cuenta que X-Frame-Options no admite subdominios comodín y solo permite un valor de dominio por instancia de cabecera. Para clientes en diferentes subdominios, necesitará lógica a nivel de servidor para establecer la cabecera dinámicamente basándose en la cabecera de solicitud Referer u Origin.

2. Atributos de cookies SameSite: Todas las cookies de sesión y autenticación deben actualizarse para llevar SameSite=None; Secure. En una pila de WordPress/WooCommerce que ejecuta PHP, el enfoque más fiable es establecer esto globalmente a nivel de PHP:

session.cookie_samesite = «None»

session.cookie_secure = 1

Verifique que todos los plugins de terceros (pasarelas de pago, análisis, gestores de sesión) también utilicen SameSite=None; Secure en sus cookies. Una sola cookie no conforme de un plugin puede romper la sesión incluso si las cookies de su plataforma principal están configuradas correctamente.

Carga de mantenimiento continuo: Cada nuevo cliente en una nueva plataforma de compras añade otro dominio a su lista blanca de frame-ancestors. Las migraciones de plataformas de compras, los nuevos patrones de subdominios y las actualizaciones de seguridad del navegador pueden romper silenciosamente las sesiones existentes sin previo aviso. Esta sobrecarga de mantenimiento es la razón principal por la que PunchOut Rocket habilita el proxy inverso por defecto.

De un vistazo: Proxy inverso activado vs. desactivado

  • frame-ancestors / X-Frame-Options: Gestionado por PunchOut Rocket (Proxy activado) vs. Configurar en su servidor (Proxy desactivado).
  • Cookies SameSite=None; Secure: No existen cookies de origen cruzado (Proxy activado) vs. Deben establecerse en todas las cookies (Proxy desactivado).
  • Nuevo cliente en una nueva plataforma: Cero cambios de configuración (Proxy activado) vs. Añadir nuevo dominio a la lista blanca (Proxy desactivado).
  • Plugins Autoptimize / de incrustación de activos: Deben deshabilitarse (Proxy activado) vs. No hay proxy que interfiera (Proxy desactivado).
  • Requisito HTTPS: Impuesto por PunchOut Rocket (Proxy activado) vs. Requerido por SameSite=None (Proxy desactivado).
  • Acceso al servidor necesario: Ninguno (Proxy activado) vs. Requerido para la configuración de cabeceras (Proxy desactivado).
  • Mantenimiento a lo largo del tiempo: Cero (Proxy activado) vs. Continuo por cada nuevo cliente (Proxy desactivado).

Conclusión

El muro invisible entre su tienda online y el portal de compras de un comprador no es un error en su código o en el sistema de su cliente. Es una consecuencia predecible de cómo los modelos de seguridad del navegador manejan la incrustación de iFrames de origen cruzado, y afecta a todos los proveedores que intentan conectarse a Ariba, Coupa o Jaggaer con un sitio de comercio electrónico estándar.

La política de seguridad de contenido frame-ancestors y la restricción de cookies SameSite existen por buenas razones: protegen a los usuarios del clickjacking y del seguimiento entre sitios. Pero crean una incompatibilidad genuina con el modelo PunchOut que requiere una solución estructural, no un parche de configuración.

El proxy inverso de PunchOut Rocket proporciona esa solución estructural. Al enrutar toda la sesión del comprador a través de la infraestructura de PunchOut Rocket, el navegador ve un origen único y consistente durante toda la sesión. Las restricciones de iFrame de origen cruzado simplemente no se aplican. Las cookies son de primera parte. No se necesita ningún cambio de configuración del servidor en su tienda, y no se requiere mantenimiento continuo a medida que incorpora nuevos clientes en nuevas plataformas de compras.

La única contrapartida es la compatibilidad con plugins: si su pila de WordPress o WooCommerce utiliza herramientas agresivas de minificación de HTML como Autoptimize con la codificación en línea Base64 habilitada, estas deben deshabilitarse. En la práctica, esto tiene un impacto insignificante en el rendimiento del sitio regular y es un cambio de configuración único.

Para los proveedores que necesitan un control total sobre su entorno de servidor y prefieren gestionar la configuración de origen cruzado ellos mismos, el proxy puede deshabilitarse, pero los requisitos manuales son sustanciales y aumentan con cada nueva relación con el cliente. Para la gran mayoría de los proveedores, el proxy inverso es la opción predeterminada correcta: compatibilidad sin fricciones y sin mantenimiento con cada portal de eProcurement que utilizan sus clientes.

¿Está listo para conectar su tienda a cualquier plataforma de eProcurement?

PunchOut Rocket se encarga de la compatibilidad de los iFrames, las políticas de cookies y la traducción de cXML/OCI, para que usted pueda centrarse en captar y atender a clientes corporativos en lugar de depurar cabeceras de seguridad del navegador.

Logo di PunchOut Rocket con servizi di integrazione OCI e cXML.

Contacto

Via Manin 30,
21100 Varese
Tel. 0332/239546
info@weblink.it
weblinksrl@pec.weblink.it

Empresa

Weblink srl
P.IVA IT02285720120
SDI: M5UXCR1
www.weblink.it
Política de privacidad

©Copyright PunchOut Rocket – Desarrollado por Weblink