Cookie - 跨多个域设置

时间:2011-12-06 20:56:16

标签: javascript jquery cookies setcookie

我公司的设置如下:

  • subdomain1.domain1.com
  • subdomain2.domain1.com
  • subdomain3.domain1.com
  • subdomain4.domain1.com
  • subdomain5.domain1.com
  • subdomain6.domain1.com

  • subdomain1.domain2.com

  • subdomain2.domain2.com
  • subdomain3.domain2.com
  • subdomain4.domain2.com
  • subdomain5.domain2.com
  • subdomain6.domain2.com

在每个网站上,请注意每个子域可以有一百个网站,用户可以登录。作为开发人员,我们必须在多个浏览器中测试前端,但只有在登录后的某个部分才需要进行某些工作

我编写了一个用户脚本,可以让我们保存用户名和密码(以及由于机密性而无法提及的其他详细信息)。脚本通过填写登录表单并单击“提交”按钮来检查用户帐户是否存在。如果没有,它会为我们注册 - 从而使注册过程自动化。

在同一个域的子域之间共享Cookie非常简单。如果我在subdomain1.domain1.com上,我可以保存一个可以通过subdomain2.domain1.com检索的cookie。但是,我还想为domain2保存这些。我似乎无法让这个工作。

我可以从这里看到两个解决方案 - 或者:

1)使用userscript附加iFrame,该用户脚本在domain2上加载站点。然后使用查询字符串来决定要设置什么,或者;

2)使用带有method =“POST”的表单,然后只发布到每个域上的文件中。

无论哪种方式都是资源密集型的,特别是如果cookie每次更改时都会更新。我们还有URL屏蔽功能。所以我们还必须考虑像abc.clientdomain1.com,abc.clientdomain2.com等网站。

有没有人知道更容易实现这一目标的方法?

5 个答案:

答案 0 :(得分:11)

专门为您的Cookie创建一个公共域,并将其用作getter / setter API。

http://cookie.domain.com/set/domain1
http://cookie.domain.com/get/domain1

http://cookie.domain.com/set/domain2
http://cookie.domain.com/get/domain2

等等。

答案 1 :(得分:8)

这个答案与我对“Set cookie on multiple domains with PHP or JavaScript”问题的回答略有不同。

做谷歌正在做的事情。创建 PHP (或任何其他服务器语言文件)文件,在所有3个域上设置cookie。然后在要设置登录的域上,创建一个 HTML 文件,该文件将加载在其他2个域上设置cookie的 PHP 文件。例如:

<html>
 <head></head>
 <body>
 Please wait..........
 <img src="http://domain2.com/setcookie.php?user=encryptedusername"/>
 <img src="http://domain3.com/setcookie.php?user=encryptedusername"/>
 </body>
</html>

然后在 body 标记上添加 onload 回调。只有当图像完全加载时才会加载文档,即在其他2个域上设置cookie时。 Onload回调:

<head>
 <script>
 function loadComplete(){
  window.location="http://domain1.com";//URL of domain1
 }
 </script>
</head>
<body onload="loadComplete()">

现在,Cookie已在三个域上设置。

Source

答案 2 :(得分:2)

出于安全原因,网站无法在其他域上设置或检索Cookie。通过javascript脚本提交表单可能是最容易做到的,并且仍然会在浏览器缓存中存储您需要的软件。

答案 3 :(得分:2)

包含来自domain2的脚本标记,该标记使用用户名和散列密码设置cookie:

<script type="text/javascript" src="http://domain2.com/cookie_login_page.php?username=johnsmith&hash=1614aasdfgh213g"></script>

然后,您可以检查以确保散列密码匹配(单向)。

关键点:

  1. 通过在散列字符串之前附加服务器将同意的时间戳(例如,16:00,16:10等),使URL中的哈希时间敏感。如果您使用的是HTTPS,这不是问题。

  2. 如果您的密码已经过哈希处理,假设两台服务器上的盐相同,那么对密码进行双重哈希就不会有什么坏处。

  3. 示例PHP代码:

    的src:

    <script type="text/javascript" src="/cookie_login_page.php?username=<?php echo $username; ?>&hash=<?php echo md5($password . date('H')); ?>"></script>
    

    DEST:

    <?php 
    
    $password = get_password($_GET['username']);
    if($_GET['hash'] == md5($password . date('H')) {
        // set the cookie
    }
    

答案 4 :(得分:0)

正如其他人所说,您无法跨域访问Cookie。但是,如果您可以控制服务器代码,则可以在正文中返回信息,并允许客户端按服务器读取和存储该信息。

就我而言,我将单个客户端连接到多个服务器,并保持与每个服务器的经过身份验证的连接。我需要知道每个会话的会话何时到期,因此身份验证服务返回cookie,并且它修改响应的主体以发回相关数据,以便我可以读取该数据并设置我自己的cookie

通过这样做,我可以手动跟踪我需要的内容。在每种情况下都不会工作,但可能对像我这样的人来说。