我有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相关的一般问题)。一旦基本版本正常工作,我将添加适当的安全机制。
答案 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。所以你必须做一些前端工作。
我就是这样做的:
这将为所有域设置cookie,用户将登录到所有域。假设它们都使用相同的数据库并且具有正确的crossdomain.xml配置,以便它们可以相互进行ajax调用。
当用户注销时,只需将该用户的唯一键设置为NULL即可。这将使用户注销所有网站。