2010-11-03 10 views
9

que tiene un dominio principal: main.com, subdominios: test1.main.com, test2.main.com y otros dominios one.com, two.com.autenticación de PHP con múltiples dominios y subdominios

Ahora es el hecho como estos:

ini_set("session.cookie_domain", ".main.com"); 

$domain = 'main.com'; 

login.php

$user = $db->query("SELECT id, login FROM users WHERE email=? AND password=?", 
array($email, $password), "rowassoc"); 

if($user) 
{ 
    $_SESSION['user_id'] = $user['id']; 
    $_SESSION['user_name'] = $user['login']; 

    $time = 100000; 

    setcookie('email', $email, time() + $time, "/", "." . $domain); 
    setcookie('password', $password, time() + $time, "/", "." . $domain); 

    header('Location: http://' . $user['login'] . "." . $domain); 
    exit; 
} 

añaden en cada página:

if(!isset($_SESSION['user_id'])) 
{ 
    if(isset($_COOKIE['email']) && isset($_COOKIE['password'])) 
    { 
    $email = $_COOKIE['email']; 
    $password = $_COOKIE['password']; 

    $user = $db->query("SELECT id, login FROM users WHERE email=? AND password=?", 
    array($email, $password), "rowassoc"); 

    if($user) 
    { 
     $_SESSION['user_id'] = $user['id']; 
     $_SESSION['user_name'] = $user['login']; 
    } 
    } 
} 
else 
{ 
    $user = $db->query("SELECT id, login FROM users WHERE id=?", 
    array($_SESSION['user_id']), "rowassoc"); 


    if(!$user) 
    { 
    setcookie('email', '', time() , "/", "." . $domain); 
    setcookie('password', '', time() , "/", "." . $domain); 
    unset($_SESSION['user_id']); 

    session_destroy(); 
    setcookie("PHPSESSID","",time(), "/", "." . $domain); 
    } 
    else 
    { 
    $_SESSION['user_id'] = $user['id']; 
    $_SESSION['user_name'] = $user['login']; 
    } 
} 

logout.php

if(isset($_SESSION['user_id'])) 
{ 
    setcookie('email', '', time() , "/", "." . $domain); 
    setcookie('password', '', time() , "/", "." . $domain); 
    unset($_SESSION['user_id']); 
    unset($_SESSION['user_name']); 

    session_destroy(); 
    setcookie("PHPSESSID","",time(), "/", "." . $domain); 

    header('Location: /main'); 
    exit; 
} 

Pero funciona solo en el dominio main.com y sus subdominios test1.main.com, test2.main.com.

Necesito de alguna manera guardar la sesión y en otros dominios one.com, two.com.

Cómo hacer la autenticación segura, si hay soluciones, realmente me confunde, por favor, dígale con el ejemplo.

+0

Necesitamos ** manera ** más detalles sobre lo que está tratando de lograr. ¿Qué tiene que ver la autenticación con los diferentes dominios? Por favor edite su pregunta para agregar más detalles. – webbiedave

+0

Lo siento. Сode agregado. – swamprunner7

+0

Duplicado de http://stackoverflow.com/questions/244008/how-do-i-maintain-php-sessions-across-multiple-domains-on-the-same-server – Brad

Respuesta

9

Hasta donde yo sé, el cruce de sesiones entre subdominios está bien, pero no se transferirá a un dominio completamente nuevo. Para hacer eso necesitas algún tipo de método de datos centralizado o una API.

Método de base de datos: tendrá que crear un acceso remoto de datos MySQL para que domain2.com pueda acceder a la base de datos en domain1.com. Cuando se realiza un inicio de sesión, no solo debe crearse una nueva sesión, sino que debe colocarse un token de inicio de sesión único (con un tiempo de caducidad) en la base de datos de mysql. Ahora, para cada enlace que va desde domain1.com a domain2.com, debe agregar una variable $ _GET que contenga una identificación de sesión generada aleatoriamente (hará md5 hash). domain2.com, al recibir al visitante, tomará la variable $ _GET, la ejecutará a través de la base de datos MySQL para encontrar el token de inicio de sesión, y si hay una coincidencia, considere que el usuario haya iniciado sesión (y tal vez incruste un $ _COOKIE como bien para almacenar los datos de inicio de sesión). Esto hará que el inicio de sesión sea transferible entre dos dominios completamente diferentes.

Método de API: debe crear un método de API, de modo que domain1.com pueda responder a una solicitud externa de dominios autorizados para recuperar el token de inicio de sesión cuando un usuario se reenvía. Este método también requerirá que todos los enlaces que van desde domain1.com a domain2.com se añadan con una variable $ _GET para pasar el hash de sesión único. Luego, al recibir al visitante, domain2.com hará una solicitud curl() a domain1.com/userapi.php (o lo que usted llame el archivo) y las variables se deben probar con respecto a lo que hay en la base de datos.

Esto es lo mejor que puedo explicarlo ..escribir esto en código es una tarea importante, así que no puedo comprometerme. Pero a juzgar por tu código, tienes una muy buena comprensión de PHP, ¡así que estoy seguro de que lo lograrás!

Buena suerte compañero.

+0

bien, entiendo tu pensamiento, intentaré hacerlo, ¡gracias! – swamprunner7

+0

Dulce ... comente aquí si tiene alguna otra pregunta, me gustaría que esto también funcione. Hasta donde yo sé, la autenticación de Facebook en sitios web de terceros (dominios totalmente diferentes) utiliza una metodología de token de API similar. – jeffkee

+0

De acuerdo, pero con la recomendación de que OP encuentre una solución existente en lugar de hacerla suya. "Mis primeros sistemas de seguridad son notoriamente vulnerables al ataque. –

1

Para mantener sus sesiones en varios dominios, debe usar session_set_cookie_params(). Con eso, puedes especificar tu dominio. Por ejemplo ...

session_set_cookie_params(10000, "/", ".main.com"); 

que establecerá el tiempo de espera de la sesión en 10.000 segundos para todos los documentos bajo la raíz del sitio, y para todos los subdominios de main.com.

Debe llamar al session_set_cookie_params() antes de hacer session_start().

+0

lo hice también ini_set ("session.cookie_domain", ".main.com"); pero problema en otros dominios (one.com, two.com) no en los subdominios. – swamprunner7

+1

Ah, ya veo. Bueno, para eso, tendrá que pasar la ID de sesión manualmente, y probablemente almacene esta información de sesión en alguna parte. No puede tener cookies creadas en un dominio y leídas por otro. – Brad

+0

¿Cómo puedo hacer esto? – swamprunner7

2

Pero si el usuario llega directamente a los dominios one.com, one.com no puede saber si el usuario inició sesión con la respuesta correcta mencionada anteriormente, parece que debe usar algunos js adicionales, ¡es jsonP! dejamos que account.main.com/userLoginStat.php?callback=loginThisDomain para verificar si el usuario tenía login main.com, si es así, la función de devolución de llamada js loginThisDomain hace algo al usuario de la autenticación a one.com.

Cuestiones relacionadas