跨多个域的PHP会话


PHP session across multiple domains

我为我的公司提供了一个Web服务(abc.com),它有自己的用户数据库,运行得很好。现在,我的公司想添加一些额外的服务,这些服务位于与另一个域(xyz.com)完全不同的服务器上,但仍然使用来自abc.com的相同登录数据,因为我们对它有完全的控制权,而且会有类似的服务器,如xyz.com,所以在xyz.com上导入用户数据库是毫无疑问的。

我的第一个想法是在从xyz.com提交登录表单时使用abc.com的checkuser.php,但后来我了解到会话cookie内容绑定到了域。至少我是这么理解的。

之后,我想通过AJAX和HTTPS访问我的checkuser.php,并通过POST将加密的会话数据提交到xyz.com。这也失败了,因为出于安全原因,AJAX似乎无法跨多个服务器工作。

现在我没有主意了,不知道如何使用我们的用户数据库在国外服务器上安全地验证用户。

我会使用单点登录(SSO)来代替共享会话。这样,就不会使网站的代码相互依赖。如果您稍后决定更改其中一个网站上的某些内容,则无需担心破坏其他网站上的功能,并且如果您选择链接到新网站,则可以重用相同的解决方案。

更好的是,有人已经为你做了它,而且你自己创造的东西可能更安全。

维基百科对SSO有一些很好的常识。此外,还要研究OAuth和OpenID。将这些术语与PHP结合起来,搜索应该会让你走上正轨。

另一个选项是让xyz.com上的登录功能直接连接到abc.com的数据库来检查登录名和密码。然后,您可以使用xyz.com的数据库来处理其他所有内容。此外,如果你真的想,你可以将会话信息存储在abc.com上的数据库中,而不是临时文件,然后你也可以从xyz.com访问这些数据。下面是如何做到这一点的示例。

我使用php的时间不长,自己也没有遇到过这个问题,但是,我一直在努力研究,并找到了一个我可以帮助你的答案。

如果你只是想访问服务器xyz.com上的脚本和DB,你可以使用以下功能,从位于单独服务器(abc.com)上的脚本中,使用其url或IP地址来获取脚本的内容:

/* This example allows my example script on server mvc.com
to access the script on oreilly.com */
file_get_contents("http://oreilly.com");

由于您正在远程访问代码,而我在这里是在暗中拍摄,我认为file_get_contents()将允许您通过服务器xyz.com上的脚本中的$_POST或$_get方法设置变量,并将值发送到服务器abc.com上的脚本。从那里,您可以将这些变量存储在位于单个服务器上的$_SESSION变量中,处理原始$_SESSION变量和大部分处理的服务器。

如果你需要经常来回,这可能会成为服务器之间相当复杂的"捉迷藏游戏",但我认为,如果你不能将数据移动到一台服务器上,这可能是解决问题的一种方法。如果您计划好脚本的结构,这将允许您将这些$_SESSION变量全部存储在一个地方。