Autenticação PHP com vários domínios e subdomínios

Eu tenho um domínio principal: main.com , subdomínios: test1.main.com , test2.main.com e outros domínios one.com , two.com .

Agora é feito assim:

 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; } 

adicionado em 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; } 

Mas funciona apenas no domínio main.com e seus subdomínios test1.main.com , test2.main.com .

Eu preciso de alguma forma salvar a session e em outros domínios one.com , two.com .

Como melhor fazer autenticação segura, se houver soluções, eu realmente confuso, por favor, com um exemplo.

Tanto quanto eu sei, as sessões de cruzamento entre subdomínios estão bem, mas não serão transferidas para um novo domínio. Para fazer isso, você precisa de algum tipo de método de dados centralizado ou de uma API.

Método do database: você terá que criar um access remoto de dados MySQL para que o domain2.com possa acessar o database no domain1.com. Quando um log-in é executado, não só ele deve criar uma nova session, mas um token de logon único (com um tempo de expiração) deve ser colocado no database mysql. Agora, para cada link que passa de domain1.com para domain2.com, você deve adicionar uma variável $ _GET que contenha um id de session gerado aleatoriamente (o md5 hash fará). domain2.com, ao receber o visitante, levará a variável $ _GET, executá-lo através do database MySQL para encontrar o token de login e, se houver uma correspondência, considere esse usuário estar logado (e talvez incorporar um $ _COOKIE como bem para armazenar os dados de login). Isso tornará o log-in transferrable entre dois domínios completamente diferentes.

Método da API : você precisa criar um método de API, para que domain1.com possa responder a uma solicitação externa de domínios autorizados para recuperar o token de login em um usuário que está sendo encaminhado. Este método também exigirá que todos os links que vão de domain1.com para domain2.com sejam anexados com uma variável $ _GET para passar o hash de session exclusivo. Então, ao receber o visitante, domain2.com fará uma solicitação curl () para domain1.com/userapi.php (ou seja o que for que você chame o arquivo) e as variables ​​devem ser testadas em relação ao que está no database.

Este é o melhor que eu posso explicar … escrever isso no código é um trabalho significativo, então não posso comprometer. Mas, a julgar pelo seu código, você tem uma boa compreensão do PHP, por isso estou confiante de que você vai tirar isso!

Boa sorte, meu caro.

Mas se o usuário alcançar os domínios one.com diretamente, do que o one.com não pode saber se o usuário teve login pela resposta certa mencionada acima, parece que deve usar alguns js extras, é o jsonP! nós deixamos account.main.com/userLoginStat.php?callback=loginThisDomain para verificar se o usuário tinha login main.com, se assim for, a function de retorno de js loginThisDomain faz alguma coisa para autologin user to one.com.

Para manter suas sessões em vários domínios, você precisa usar session_set_cookie_params () . Com isso, você pode especificar seu domínio. Por exemplo…

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

Isso irá definir o tempo limite da session em 10.000 segundos para todos os documentos sob a raiz do site e para todos os subdomínios do main.com.

Você deve chamar session_set_cookie_params() antes de fazer session_start() .