Saltar al contenido principal

CORS y validación de origen

Neuroon valida el Origin de cada request de forma distinta según el endpoint y el tipo de credencial. Esta página es la fuente única de verdad: si una página de docs dice algo distinto, gana esta tabla.

Matriz canónica

EndpointAuthAcepta Origin ausente (server-to-server)Origin debe coincidir conCómo añadir un dominio
POST /api/plugin/shops/{shopId}/products/syncX-Shop-API-Key✅ Sín/a — sólo se valida que la API Key pertenezca al shop.n/a
GET /api/plugin/shops/{shopId}/productsX-Shop-API-Key✅ Sín/an/a
POST /api/plugin/shops/{shopId}/track/conversionX-Shop-API-Key✅ Sín/an/a
POST /api/plugin/shops/{shopId}/verifyX-Shop-API-Key✅ SíEl domain del body se compara con shop.url.Editar shop.url en el dashboard.
GET /api/plugin/shops/{shopId}/verification-dataX-Shop-API-Key✅ Sín/an/a
POST /api/shops/{id}/widget-tokenX-Shop-API-Key✅ Sín/an/a
GET / POST /api/widget/search, /suggestions, /trending, /compare, /cart/cross-sellX-Widget-Token✅ Sí (en navegador siempre llega Origin)app.widget.allowed-originsshop.url (si llega Origin, debe coincidir)Pedir a soporte que añada el dominio a allowed-origins.
POST /api/widget/search/audio, /visualX-Widget-Token✅ SíIgual que arribaIgual que arriba
POST /api/widget/track/click, /track/conversionX-Widget-Token✅ SíIgual que arribaIgual que arriba
POST /api/widget/analytics/event(s)X-Widget-Token✅ SíIgual que arribaIgual que arriba
POST /api/webhooks/stripeStripe-Signature✅ Sí (entra desde Stripe)n/an/a

El validador WidgetTokenValidator.validateOrigin acepta Origin ausente o vacío (early-return en WidgetTokenValidator.java:60-63). Sólo cuando llega Origin se compara contra app.widget.allowed-origins ∪ shop.url. Esto hace los endpoints widget compatibles con curl/server-to-server, aunque desde un navegador siempre llegará Origin.

POST /api/tokens/refresh no aparece en esta tabla porque no es parte del contrato widget/plugin: refresca JWTs de usuario del dashboard de Neuroon (TokenController.java:36).

Defaults de app.widget.allowed-origins

Por defecto (application.yml:273-276):

  • localhost y 127.0.0.1 (suffix-match: cualquier subdominio o puerto vale).
  • neuroon.ai (suffix-match: incluye *.neuroon.ai, p. ej. dev.neuroon.ai, cdn.neuroon.ai).
  • El shop.url registrado en el dashboard.

Añadir un dominio nuevo

  1. Si es tu dominio principal: edítalo desde el dashboard → tu tienda → Settings → Storefront URL. El cambio aplica al siguiente request servido.
  2. Si necesitas dominios extra (staging, ramas, dominios de marketing que comparten widget): abre un ticket en soporte indicando shopId y los dominios. La lista vive en config del backend (app.widget.allowed-origins).

Self-service para dominios extra está en roadmap. Mientras tanto, el dashboard sólo edita shop.url (un único valor).

Errores típicos

SíntomaCausaSolución
Browser bloquea XHR con CORS error y consola muestra 403El widget está corriendo en un dominio que no está en allowed-origins ni coincide con shop.url.Verifica shop.url o pide que añadan el dominio a allowed-origins.
403 DOMAIN_MISMATCH al llamar /verifyEl url del body no coincide con shop.url.Edita shop.url en el dashboard y reintenta.
401 al servir el widget desde el navegadorToken expirado, no presente en el HTML, o mezcla de entorno (token DEV vs api.neuroon.ai).Renueva el token y comprueba la URL base.

Próximas lecturas