在两个网站之间共享cookie

时间:2012-09-11 13:10:10

标签: http cookies

我已经建立了一个网站(A),它可以从单独的Web服务登录并检索客户数据。

拥有(A)的组织也有一个网站(B),其中包含一个网络表单。他们希望(A)上的登录客户能够点击(B)并查看预先填充的表格及其详细信息。

这意味着(A)必须将他们的客户ID写入cookie,(B)可以读取,然后(B)可以从Web服务请求数据,并预先填充表单。

这提出了两个问题:

  1. 网站(B)可以阅读网站(A)的cookie吗?

  2. 如果是这样,为了防止有人编辑cookie并在表单中查看其他人的数据,我需要做一些事情,比如加密(A)上的cookie,然后在(B)中解密 - 任何沿着这条线的建议?

  3. 我无法将现有登录更改为OAuth或其他内容,因为Web服务已被其他几个网站使用,因此无法更改。

7 个答案:

答案 0 :(得分:19)

没有。网站B无法从网站A读取cookie。

最简单的解决方法是将登录/凭据信息从网站A传递到网站B,并让网站B设置单独的cookie。例如,登录到网站A后,您可以使用加密的查询字符串快速将其重定向到网站B.然后,网站B可以读取信息,设置自己的cookie,并将用户重定向回站点A.

这很麻烦但可能。

答案 1 :(得分:15)

您提到同一家公司拥有这两个网站。如您所料,如果网站具有相同的域名,如www.mycompany.com和store.mycompany.com,那么他们可以共享Cookie。 HTTP响应头看起来像这样:

Set-Cookie: user_id=1295214458; Path=/; Domain=.mycompany.com

由于客户端可以直接访问此数据,因此您还应该包含签名,以便检测到篡改。通常整个事情都被加密并签名为“令牌”,并将其设置为cookie。但从技术上讲,只需签名即可。

答案 2 :(得分:6)

如果在您的情况下,您的所有用户都使用支持HTML5的浏览器,则可以使用window.postMessage方法,一方允许addEventListener,另一方另一方postMessage。这是一篇很好的文章/示例:https://developer.mozilla.org/en-US/docs/Web/API/window.postMessage

然后步骤很简单:

  1. 向网站A添加隐藏的iframe到网站B
  2. 使用window.postMessage
  3. 将B的cookie发送给A.
  4. 将收到的Cookie存储在A&#39的Cookie中

答案 3 :(得分:2)

Cookie只能由他们设置的单个域访问。

我相信如果您在同一个域上使用两个子域,则可以共享cookie,但浏览器不会将在一个域上设置的cookie发送给任何其他域。

编辑:您还希望避免在Cookie中存储大量数据。您是否有可能创建一个网站B可以使用javascript查询的API?

答案 4 :(得分:0)

互联网上有开源工具可以做到这一点,但这违背了Cookie理念背后的全部理念。 Cookie只能由一个域访问。但是,你可以在浏览器中模拟该域名和“Hack”。不建议这样做,有些浏览器的安全性更高,不允许这样做。

我建议您在网站A中创建一个Web服务,并提供对B的阅读权限以便阅读它。

答案 5 :(得分:0)

潜在的解决方法:您可以在辅助站点上使用内联框架来显示主站点的内容(占用整个窗口):

<!DOCTYPE HTML>
<html>  
  <head>  
       <title>your page title</title>  
        <style type="text/css">
            body, html {
            margin: 0; padding: 0; height: 100%; overflow: hidden;
            }
            #content {
            position:absolute; left: 0; right: 0; bottom: 0; top: 0px; 
            }
        </style>
  </head>  
  <body>
    <div id="content">
    <iframe width="100%" height="100%" frameborder="0" src="http://yourMainSite.com/dataDependentPage.php" ></iframe>
    TESTING
    </div>
  </body>  
 </html>

答案 6 :(得分:0)

HttpCookie.Domain Property可能会有帮助。

节选:

MyCookie.Domain = domainName;