当前位置: 首页 > 面试题库 >

具有多个域和子域的PHP身份验证

毋宸
2023-03-14
问题内容

我有一个主要的领域:main.com,子:test1.main.comtest2.main.com和其他领域one.comtwo.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.comtest2.main.com

我需要以某种方式保存会话和其他域one.comtwo.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有很好的了解,所以我相信您一定会成功!

祝你好运。



 类似资料:
  • 所有的, 有人能就如何使用JAAS LoginContext对多个KDC/Realm组合进行身份验证提供建议吗?换句话说,如果尝试1对领域A失败,请尝试领域B。 类似于下面的伪代码。 一如既往,任何帮助都非常感谢。 查看剪贴板打印文本?

  • 问题内容: 我试图通过将数据提取到网页中来使用Beanstalk(beanstalkapp.com)API,以便人们可以查看它而无需访问我的SVN。 我正在尝试访问它的方法是通过jQuery使用AJAX请求。代码在下面,但是每次都会出现错误,并且无法返回数据。 如果我直接通过浏览器(http://username.beanstalkapp.com/api/changesets.json)访问该UR

  • 在DropWizard中,我可以设置基本身份验证,如下所示(在impl中): 领域在DropWizard中是什么意思,在中指定它有什么意义?它创造了一些东西与这个领域在引擎盖下?

  • 在auth-routes示例中,api和nuxt一起启动并使用一个Node.js服务器实例。但是,有时我们应该使用jsonWebToken处理外部api身份验证问题。在这个例子中,将用最简单的方式解释。 官方 auth-module 如果要实现复杂的身份验证流程,例如OAuth2,我们建议使用官方 auth-module 结构 由于Nuxt.js同时提供服务器和客户端呈现,并且浏览器的cookie

  • 问题内容: 在Django中,我将SESSION_COOKIE_DOMAIN设置为我的域名。但是我实际上想使用两个不同的域名来运行同一站点。 在设置了SESSION_COOKIE_DOMAIN的情况下,只有命名域才允许用户登录。是否可以同时允许两个域登录? 问题答案: 如果你将会话cookie域设置为以“。”开头。字符,它将使你能够处理通配符子域并在多个子域之间共享会话cookie(登录会话)。

  • 首先,我不知道AWS组件是如何工作或配置的。我只是从顶层的角度设计一个架构,然后某个系统管理员会去实现它。 如果我有一个运行HTTPS服务器或使用通配符证书接受WSS连接的ELB和EC2实例(,…),ELB是否应该监听不同的端口(如ELB: 443-