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