我有一个主域:main.com
,子域:test1.main.com
,test2.main.com
和其他域one.com
, two.com
.
现在是这样完成的:
ini_set("session.cookie_domain", ".main.com");
$domain = 'main.com';
登录.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'];
}
}
注销.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
。
我需要以某种方式保存 session 和其他域 one.com
、two.com
。
如何最好地进行安全认证,如果有解决方案,我很困惑,请举例说明。
最佳答案
据我所知,子域之间的交叉 session 很好,但它不会转移到一个全新的域。为此,您需要某种集中式数据方法或 API。
数据库方法:您必须创建远程 MySQL 数据访问,以便 domain2.com 可以访问 domain1.com 上的数据库。当执行登录时,它不仅应该创建一个新的 session ,而且应该将一个唯一的登录 token (带有到期时间)放入 mysql 数据库中。现在,对于从 domain1.com 到 domain2.com 的每个链接,您应该添加一个 $_GET 变量,其中包含一个随机生成的 session ID(md5 哈希就可以)。 domain2.com 在收到访问者后,将获取 $_GET 变量,通过 MySQL 数据库运行它以查找登录 token ,如果匹配,则认为该用户已登录(并且可能嵌入 $_COOKIE 作为以及存储登录数据)。这将使登录可在两个完全不同的域之间转移。
API 方法:您需要创建一个 API 方法,以便 domain1.com 可以响应来自授权域的外部请求,以在转发用户时检索登录 token 。此方法还要求所有从 domain1.com 到 domain2.com 的链接附加 $_GET 变量以传递唯一 session 哈希。然后,在收到访问者后,domain2.com 将对 domain1.com/userapi.php(或您称之为文件的任何内容)执行 curl() 请求,并且应根据数据库中的内容测试变量。
这是我能解释的最好的..用代码写出来是一项重要的工作,所以我不能提交。但是从你的代码来看,你对 PHP 有很好的理解,所以我相信你会成功的!
祝你好运,伙计。
关于具有多个域和子域的 PHP 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4091677/