我有一个主要的领域:main.com,子:test1.main.com,test2.main.com和其他领域one.com,two.com。
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']; } }
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; }
但它仅适用于域main.com及其子域test1.main.com,test2.main.com。
我需要以某种方式保存会话和其他域one.com,two.com。
如何最好地进行安全身份验证,如果有解决方案,我真的很困惑,请举例说明。
据我所知,跨子域之间的会话很好,但不会延续到整个新域。为此,您需要某种集中式数据方法或API。
数据库方法: 您将必须创建一个远程MySQL数据访问权限,以便domain2.com可以访问domain1.com上的数据库。执行登录时,不仅应创建一个新会话,而且应将唯一的登录令牌(具有到期时间)放入mysql数据库。现在,对于从domain1.com到domain2.com的每个链接,您都应该添加一个$ _GET变量,该变量包含一个随机生成的会话ID(md5哈希即可)。domain2.com接收到访问者后,将使用$ _GET变量,通过MySQL数据库运行该变量以找到登录令牌,如果匹配,则认为该用户已登录(也许将$ _COOKIE嵌入为以及存储登录数据)。这将使登录可在两个完全不同的域之间转移。
API方法 :您需要创建一个API方法,以便domain1.com可以响应来自授权域的外部请求,以在转发用户时检索登录令牌。此方法还要求从domain1.com到domain2.com的所有链接都必须附加$ _GET变量,以传递唯一的会话哈希。然后,在接收到访问者之后,domain2.com将对domain1.com/userapi.php(或任何您称其为文件)进行curl()请求,并且应针对数据库中的内容测试变量。
这是我能解释的最好的..用代码写出来是一项重要的工作,所以我无法提交。但是从您的代码来看,您对PHP有很好的了解,所以我相信您一定会成功!
祝你好运。