2011-12-06 12 views
9

Mi empresa tiene una configuración de la siguiente manera:Galletas - establecer a través de múltiples dominios

  • subdomain1.domain1.com
  • subdomain2.domain1.com
  • subdomain3.domain1.com
  • subdomain4.domain1 .com
  • subdomain5.domain1.com
  • subdomain6.domain1.com

  • subdomain1.domain2.com

  • subdomain2.domain2.com
  • subdomain3.domain2.com
  • subdomain4.domain2.com
  • subdomain5.domain2.com
  • subdomain6.domain2.com

En cada sitio, teniendo en cuenta que puede haber un centenar de sitios por subdominio, los usuarios pueden iniciar sesión. Nosotros, como desarrolladores, tenemos que probar interfaces en varios navegadores, pero algunos el trabajo solo puede ser requerido en una sección una vez que haya iniciado sesión.

He escrito un usuario que nos permite guardar un nombre de usuario y contraseña (y otros detalles que no puedo mencionar debido a la confidencialidad). El script verifica si la cuenta de usuario existe completando el formulario de inicio de sesión y haciendo clic en el botón Enviar. Si no, se registra para nosotros, automatizando así el proceso de registro.

Compartir cookies entre subdominios en el mismo dominio es fácil. Si estoy en el subdominio1.domain1.com, puedo guardar una cookie que se puede recuperar por el subdominio2.domain1.com. Sin embargo, también me gustaría guardar estos para domain2. No parece ser capaz de hacer que esto funcione.

veo dos soluciones desde aquí - ya sea:

1) adjuntar un marco flotante utilizando el userscript, que carga un sitio en domain2. A continuación, utiliza la cadena de consulta para decidir qué establecer a qué, o;

2) utilice un formulario con method = "POST", y simplemente publíquelo en un archivo en cada dominio.

De cualquier forma requerirá muchos recursos, especialmente si las cookies se actualizan cada vez que se modifica una cookie. También tenemos el enmascaramiento de URL en su lugar. Así que también tendríamos que tener en cuenta sitios como abc.clientdomain1.com, abc.clientdomain2.com etc.

¿Alguien sabe de una manera más fácil de lograr esto?

Respuesta

9

Cree un dominio común específicamente para sus cookies y úselo como una API getter/setter.

http://cookie.domain.com/set/domain1 
http://cookie.domain.com/get/domain1 

http://cookie.domain.com/set/domain2 
http://cookie.domain.com/get/domain2 

y así sucesivamente.

+0

Parece que sí, no estoy seguro de si ir por esto o si un formulario sería más sencillo de implementar, sobre la base de que estoy tratando de terminar esto en una semana. – ClarkeyBoy

1

Por razones de seguridad, los sitios no pueden establecer ni recuperar cookies en otros dominios. Escribir el formulario enviado a través de javascript es probablemente el más fácil de hacer, y aún almacenará los cooikes que necesita en el caché del navegador.

+0

Desafortunadamente eso era lo que temía; va a ser mucho trabajo, pero creo que sería muy gratificante implementar esto. Voy a esperar y ver si alguien más ha encontrado una manera más fácil de hacerlo antes de aceptar esta respuesta. – ClarkeyBoy

2

incluir una etiqueta script desde domain2 que establece la cookie utilizando un nombre de usuario y contraseña con algoritmo hash:

<script type="text/javascript" src="http://domain2.com/cookie_login_page.php?username=johnsmith&hash=1614aasdfgh213g"></script> 

entonces usted puede comprobar para asegurarse de que el partido contraseñas hash (sólo ida).

puntos clave:

  1. hacer que los hashes en el momento URL sensibles al anexar una marca de tiempo que será acordada por el servidor (por ejemplo, 16:00, 16:10, etc.) antes de hash la cuerda. Si está utilizando HTTPS, este es un problema menor.

  2. Si sus contraseñas ya tienen hash, no será malo duplicar las contraseñas suponiendo que las sales son las mismas en ambos servidores.

Muestra de código PHP:

src:

<script type="text/javascript" src="/cookie_login_page.php?username=<?php echo $username; ?>&hash=<?php echo md5($password . date('H')); ?>"></script> 

dest:

<?php 

$password = get_password($_GET['username']); 
if($_GET['hash'] == md5($password . date('H')) { 
    // set the cookie 
} 
5

Esta respuesta es una versión ligeramente diferente de mi respuesta a la pregunta "Set cookie on multiple domains with PHP or JavaScript".

Haz lo que Google está haciendo. Cree un archivo PHP (o cualquier otro archivo de idioma de servidor) que establezca la cookie en los 3 dominios. Luego, en el dominio donde se va a establecer el inicio de sesión, cree un archivo HTML que cargue el archivo PHP que establece cookie en los otros 2 dominios. Ejemplo:

<html> 
<head></head> 
<body> 
Please wait.......... 
<img src="http://domain2.com/setcookie.php?user=encryptedusername"/> 
<img src="http://domain3.com/setcookie.php?user=encryptedusername"/> 
</body> 
</html> 

Luego añadir una onload de devolución de llamada en cuerpo etiqueta. El documento solo se cargará cuando las imágenes se carguen por completo, es decir, cuando las cookies se establezcan en los otros 2 dominios. Devolución de llamada onload:

<head> 
<script> 
function loadComplete(){ 
    window.location="http://domain1.com";//URL of domain1 
} 
</script> 
</head> 
<body onload="loadComplete()"> 

Ahora las cookies se establecen en los tres dominios.

Source

+0

¿Cómo sé que Google está haciendo esto? – chanchal118

+0

@ chanchal118 Inspecciona la página con herramientas de desarrollador al iniciar sesión en tu cuenta de Google – Subin

0

Como otros han dicho, no se puede acceder a las cookies a través de dominios. Sin embargo, si tiene el control del código del servidor, puede devolver información en el cuerpo y permitir que su cliente lea y almacene esa información por servidor.

En mi caso, estoy conectando un solo cliente a varios servidores, manteniendo una conexión autenticada para cada uno. Necesito saber cuándo va a caducar la sesión de cada uno, de modo que el servicio de autenticación devuelve la cookie, además de que modifica el cuerpo de la respuesta para devolver los datos relevantes, de modo que pueda leer esos datos y establecer mis propias cookies .

Al hacer esto, puedo hacer un seguimiento manual de lo que necesito. No funcionará en todos los escenarios, pero podría ser para algunos como yo.

Cuestiones relacionadas