发送检查来自其他域的cookie的请求

时间:2014-07-05 12:46:16

标签: php cookies curl

我有domain1.com,domain2.com,domain3.com和centraldomain.com。

我希望在domain1,domain2和domain3之间建立连接登录/注册,以便我将所有登录表单设置为centraldomain.com/login.php。然后,我可以在该站点上创建会话,并在用户访问任何其他3个域时发送curl请求以检查该会话。我认为这样可行(如果我错了,请纠正我。)

但我想更进一步 - 我想在centraldomain.com/login.php上创建一个cookie,当用户访问任何其他网站时,他们可以向centraldomain.com发送请求检查是否有活动的cookie。

总而言之,我希望domain1能够询问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。但卷曲请求什么也没做。所以我自然需要在我甚至可以请求cookie内容之前做到这一点。说到这一点,我被告知可以做到,但这对我没有意义。 Cookie已连接到用户代理。因此,如果您发送curl请求(而不是在浏览器中打开页面),目标脚本如何知道访问者正在使用哪个用户代理?如何识别该访客的cookie?是否有必要以某种方式发送用户代理标识以及请求?

如果卷曲不起作用,你能提出不同的解决方案吗?我一直在想一些看不见的形式和iframe可以解决这个问题,但如果我不这样做,我宁愿不处理。

现在请暂时保留安全问题(关于cookie内容和与cookie相关的一般问题)。一旦基本版本正常工作,我将添加适当的安全机制。

2 个答案:

答案 0 :(得分:0)

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

以下响应标头附加到标头。

Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1

之后收到回复时,它是浏览器的一项工作来存储它(如果不支持或禁用此功能,则不存储)

因此,当您通过curl从应用程序发送它时 - 您的应用会收到此响应,并且它不关心Set-Cookie。 如果您要从域名1向用户重新发送此标题,则将为此域名存储cookie。

顺便说一下,你将无法从场景后面的其他域检查cookie,因为所有的cookie都存储在浏览器的存储器中,并随请求一起发送到服务器。

你要做的是某种OAuth,它比setcookie复杂得多。您可以尝试使用其站点http://oauth.net/2/

中的一些现有服务器\客户端库

答案 1 :(得分:0)

使用curl请求无法做到这一点。用户的浏览器必须处理cookie。此外,您无法设置/读取其他域的cookie。所以你必须做一些前端工作。

我就是这样做的:

  1. 当用户从domain1.com登录时,发送一个ajax请求到centraldomain.com并获得一个唯一的密钥,该密钥将保存在该用户的数据库中。
  2. 将Cookie设置为domain1.com。 (例如userID = yourKey)
  3. 创建一个页面,将您的唯一键作为参数进行验证,并将其从数据库中验证并设置为使您的服务器了解用户的cookie值。(在此方案中名为userID的cookie)
  4. 使用您用户浏览器中的唯一密钥对其他服务器进行ajax调用。 (以带键作为参数的页面)
  5. 通过在数据库中搜索cookie值来检查用户登录信息。
  6. 这将为所有域设置cookie,用户将登录到所有域。假设它们都使用相同的数据库并且具有正确的crossdomain.xml配置,以便它们可以相互进行ajax调用。

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