У меня есть один основной домен: main.com
, субдомены: test1.main.com
, test2.main.com
и другие домены one.com
, two.com
.
Теперь все сделано так:
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; }
добавлено на каждую страницу:
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']; } }
с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; }
с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; }
с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; }
Но он работает только на домен main.com
и его поддоменах test1.main.com
, test2.main.com
.
Мне нужно как-то сохранить сеанс и на других доменах one.com
, two.com
.
Как лучше всего сделать безопасную проверку подлинности, если есть решения, я действительно смущен, пожалуйста, скажите, например.
Насколько я знаю, перекрестные сессии между субдоменами прекрасны, но они не переносятся на совершенно новый домен. Для этого вам нужен какой-то централизованный метод данных или API.
Метод базы данных: вам нужно будет создать удаленный доступ к данным MySQL, чтобы domain2.com мог получить доступ к базе данных на домене1.com. Когда выполняется вход в систему, он должен создавать не только новый сеанс, но и уникальный лог-вход (с истечением срока действия), который должен быть помещен в базу данных mysql. Теперь для каждой ссылки, которая идет от domain1.com до domain2.com, вы должны добавить переменную $ _GET, которая содержит случайно сгенерированный идентификатор сеанса (будет выполняться хеш-файл md5). domain2.com, после получения посетителя, примет переменную $ _GET, запустит ее через базу данных MySQL, чтобы найти токен входа, и если есть совпадение, подумайте, что пользователь должен войти в систему (и, возможно, включить $ _COOKIE as хорошо хранить данные входа). Это позволит выполнить вход в систему между двумя совершенно разными доменами.
API : вам необходимо создать метод API, чтобы domain1.com мог отвечать на внешний запрос из разрешенных доменов, чтобы получить токен входа при переадресации пользователя. Этот метод также потребует, чтобы все ссылки, идущие от domain1.com до domain2.com, добавлялись с переменной $ _GET, чтобы передать уникальный хэш сеанса. Затем, после получения посетителя, domain2.com выполнит запрос curl () для domain1.com/userapi.php (или как вы его называете), и переменные должны быть протестированы против того, что находится в базе данных.
Это лучшее, что я могу объяснить. Написать это в коде – это значительная часть работы, поэтому я не могу ее совершить. Но, судя по вашему коду, у вас очень хорошее понимание PHP, поэтому я уверен, что вы это сделаете!
Удачи.
Но если пользователь достигает доменов one.com напрямую, чем один.com не может знать, пользовался ли пользователь правильным ответом, упомянутым выше, похоже, что нужно использовать некоторые дополнительные js, это jsonP! мы разрешаем account.main.com/userLoginStat.php?callback=loginThisDomain проверять, был ли у пользователя вход в систему main.com, если это так, функция обратного вызова js loginThisDomain делает кое-что для пользователя autologin на one.com.
Чтобы ваши сеансы проходили через несколько доменов, вам необходимо использовать session_set_cookie_params () . При этом вы можете указать свой домен. Например…
session_set_cookie_params(10000, "/", ".main.com");
Это установит тайм-аут сеанса в 10 000 секунд для всех документов под корнем сайта и для всех поддоменов main.com.
Вы должны вызвать session_set_cookie_params()
перед session_start()
.