Canal seguro entre dominios con JS
<< Abriendo formularios web externos/Opening external web forms
En mi último proyecto tuve que hacer comunicación entre dos dominios, donde uno envía datos al otro, pero además el segundo devolvía resultados. El asunto es que no tenía medio para atrapar esa información en mi plataforma original, y modificarla para conseguirlo estaba fuera de mi alcance (cuestiones de mantenibilidad y actualización, ya que no desarrollé la plataforma, sino que modifiqué un plugin). Por lo que, de entrada tenía que abrir un popup que mostrara formulario del segundo domino, ese mismo popup recuperaba la respuesta en un formulario (para el caso fue ASP, pero igual funciona con PHP -minucias del lenguaje-) que pertenecía a mi dominio. Esto con la esperanza de mediante javascript enviar los datos a la ventana que abrió el popup.
Con lo que no contaba fue que, a pesar de que mi plataforma y la respuesta obtenida del segundo dominio pertenecen al mismo dominio, por alguna razón consideraba a cada uno en un dominio distinto. Supongo por haber abierto de entrada el popup con el segundo dominio. Así que me dí a la tarea de buscar cómo establecer comunicación, y encontré cómo crear un canal seguro de información entre mi popup y mi ventana principal.
El script para crear mi canal desde mi popup resultó ser similar al siguiente:
var mensaje = "El mensaje..."; // una simple cadena
// cuando campos-valores necesites
var mensajeJson = json.serialize({campo1:valor1, campo2:valor2});
var miOrigen = "Mi dominio de origen"; // debe coincidir con el dominio real
window.opener.postMessage(mensaje, miOrigen);
El script para crear el canal hacia mi ventana principal terminó parecido a este:
window.addEventListener("message",
function (event) {
if ((event.origin != "Mi dominio de origen")) {
console.log(data);
return;
} else {
var theData = event.data;
//... Algún procesamiento
} else {
console.log(data);
}
}
}, false);
Hago aclaración que existe una validación de dominos que escapa al programador por seguridad, obviamente. Cuando se especifica el origen, este debe empatar con el origen real del popup, sino el canal no establecerá comunicación y arrojará un error por esa diferencia.
Comentarios
Publicar un comentario