Php 从其他域发送检查cookie的请求

Php 从其他域发送检查cookie的请求,php,cookies,curl,Php,Cookies,Curl,我有domain1.com、domain2.com、domain3.com和centraldomain.com 我想跨域1、域2和域3连接登录/注册,所以我要将它们的所有登录表单设置为提交到centraldomain.com/login.php。然后我可以在该站点上创建一个会话,并在用户访问其他3个域时发送一个curl请求来检查该会话。我想这样行得通(如果我错了,请纠正我) 但我想更进一步——我希望centraldomain.com/login.php创建一个cookie,当用户访问任何其他站点

我有domain1.com、domain2.com、domain3.com和centraldomain.com

我想跨域1、域2和域3连接登录/注册,所以我要将它们的所有登录表单设置为提交到centraldomain.com/login.php。然后我可以在该站点上创建一个会话,并在用户访问其他3个域时发送一个curl请求来检查该会话。我想这样行得通(如果我错了,请纠正我)

但我想更进一步——我希望centraldomain.com/login.php创建一个cookie,当用户访问任何其他站点时,他们可以向centraldomain.com发送请求,以检查是否有cookie处于活动状态

总而言之,我希望域1能够询问centraldomain是否有当前访问者的cookie,并获得一些cookie数据作为响应

这是我用来设置cookie的cURL代码。但是,它不起作用:

$ch = curl_init();

                curl_setopt($ch, CURLOPT_URL, "http://www.centraldomain.com/fantasy/login.php");
                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS,
                            http_build_query(array('par1' => $par1, 'par2' => $par2)));

                // receive server response ...
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

                $server_output = curl_exec ($ch);

                curl_close ($ch);
这是centraldomain.com上的login.php:

$par1=$_POST['par1'];
$par2=$_POST['par2'];

$cookievalue=$email."_____".$cryptedpass;
$date_of_expiry=time()+60*60;

setcookie("fantasylogin", $cookievalue, $date_of_expiry, "/" );var_dump($_COOKIE);
当我直接在centraldomain.com上打开此页面时,它会设置一个cookie。但是curl请求什么也不做。因此,在我请求返回cookie内容之前,我自然需要做好这一点。说到这,我被告知这是可以做到的,但这对我来说毫无意义。cookie已连接到用户代理。因此,如果您发送一个curl请求(而不是在浏览器中打开页面),那么目标脚本如何知道访问者正在使用哪个用户代理?它如何识别该访问者的cookie?是否需要以某种方式随请求一起发送用户代理标识

如果curl不起作用,你能提出一个不同的解决方案吗?我一直在想一些看不见的形式和iFrame可以做到这一点,但如果不需要的话,我宁愿不处理它


让我们暂时不考虑安全问题(关于cookie内容和与cookie相关的一般问题)。一旦基本版本正常工作,我将添加适当的安全机制。

您应该尝试了解cookie的一般工作原理。 执行
setcookie
时会发生什么

以下响应标头附加到标头

Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
之后,当收到响应时,浏览器需要存储响应(如果不支持或禁用此功能,则不存储)

因此,当您通过curl从应用程序发送它时,您的应用程序会收到此响应,而不关心
设置Cookie
。 如果您将从域1向用户重新发送此标头,则将为此域1存储cookie

顺便说一句,您将无法检查来自幕后其他域的cookie,因为所有cookie都存储在浏览器的存储中,并随请求一起发送到服务器


您试图做的是某种OAuth,它比仅仅
setcookie
复杂得多。您可以尝试从其站点使用一些现有的server\client库

这不能通过curl请求完成。用户的浏览器必须处理cookie。此外,您不能在其他域中设置/读取cookie。所以你必须做一些前端工作

我会这样做:

  • 当用户从domain1.com登录时,向centraldomain.com发送一个ajax请求,并获取一个唯一的密钥,该密钥将保存在该用户的数据库中
  • 将cookie设置为domain1.com。(例如userID=yourKey)
  • 创建一个页面,将您的唯一密钥作为参数,从数据库中验证它,并将其设置为cookie值,以使您的服务器了解用户已登录。(此场景中名为userID的cookie)
  • 使用用户浏览器中的唯一密钥对其他服务器进行ajax调用。(指向以键为参数的页面)
  • 使用数据库中的搜索cookie值检查用户登录
  • 这将为所有域设置cookie,用户将登录到所有域。假设它们都使用相同的数据库,并且具有正确的crossdomain.xml配置,以便能够相互进行ajax调用


    当用户注销时,只需将该用户的唯一密钥设置为NULL。这将使用户注销所有网站。

    谢谢,这很有意义。但是当用户删除浏览器cookie时会发生什么?我们的站点(设置cookie的站点除外)无法检查这一点,因此他们只会检查数据库表,并认为他仍在登录。或者我误解了什么?在这种情况下,若cookie不存在,您可以将用户的唯一密钥设置为NULL,但我假设用户在手动删除其cookie后向同一域发出另一个请求。还有另一种担保方式,但更为复杂。您可以向所有域发送ajax调用,以检查所有域上是否存在cookie,如果不存在,则删除数据库密钥。但这必须在每次访问页面时完成,并且您需要隐藏页面,直到此过程结束。不太好。看看,和。