【问题标题】:Send request to check cookie from other domain发送请求以检查来自其他域的 cookie
【发布时间】:2014-08-26 12:25:56
【问题描述】:

我有 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 处于活动状态。

总之,我希望 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。但是 curl 请求什么也不做。所以很自然地,我需要在我什至请求返回 cookie 内容之前解决这个问题。说到这一点,有人告诉我可以做到,但对我来说没有意义。 cookie 连接到用户代理。因此,如果您发送 curl 请求(而不是在浏览器中打开页面),目标脚本如何知道访问者正在使用什么用户代理?它如何识别该访问者的 cookie?是否有必要随请求一起发送用户代理标识?

如果 curl 不起作用,您能提出不同的解决方案吗?我一直在想一些不可见的表单和 iframe 可以解决问题,但如果没有必要,我宁愿不处理。

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

【问题讨论】:

标签: php cookies curl


【解决方案1】:

curl 请求无法做到这一点。用户的浏览器必须处理 cookie。您也不能设置/读取 cookie 到/从另一个域。所以你必须做一点前端工作。

我会这样做:

  1. 当用户从 domain1.com 登录时,向 centraldomain.com 发送一个 ajax 请求,并获取一个唯一的密钥,该密钥将为该用户保存在数据库中。
  2. 为 domain1.com 设置一个 cookie。 (例如 userID=yourKey)
  3. 创建一个页面,将您的唯一键作为参数,从数据库中对其进行验证,并将其设置为 cookie 值,以使您的服务器了解用户已登录。(在这种情况下名为 userID 的 cookie)
  4. 从用户的浏览器使用您的唯一密钥对其他服务器进行 ajax 调用。 (到以key为参数的页面)
  5. 通过在您的数据库中搜索 cookie 值来检查用户登录。

这将为所有域设置 cookie,并且用户将登录到所有域。假设他们都使用相同的数据库并具有正确的 crossdomain.xml 配置,以便他们可以相互进行 ajax 调用。

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

【讨论】:

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

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

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

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

在收到响应之后,浏览器会存储它(如果不支持或禁用此功能,则不存储)

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

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

您尝试做的是某种 OAuth,它比 setcookie 复杂得多。您可以尝试使用其站点 http://oauth.net/2/ 中的一些现有服务器\客户端库

【讨论】:

    猜你喜欢
    • 2021-01-21
    • 1970-01-01
    • 2018-03-08
    • 2020-12-20
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2021-08-28
    相关资源
    最近更新 更多