2011-12-06 66 views
9

我公司擁有一支設置如下:餅乾 - 設置跨多個域

  • 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

在每個站點上,記住每個子站點可以有一百個站點,用戶可以登錄。作爲開發人員,我們必須跨幾個瀏覽器測試前端,但有些只有在登錄後才需要工作。

我寫了一個userscript,它使我們能夠保存用戶名和密碼(以及其他我不能提及的細節,因爲機密性)。該腳本檢查是否存在通過登錄表單填寫,並點擊提交按鈕的用戶帳戶。如果不是,它註冊爲我們 - 從而自動註冊過程。

在同一個域上的子域之間共享cookie很容易。如果我在subdomain1.domain1.com我能救它可以通過subdomain2.domain1.com檢索的cookie。不過,我也想將這些保存爲domain2。我似乎無法得到這個工作。

我可以從這裏看到兩種解決方案 - 無論是:

1)連接使用userscript,它加載一個網站上DOMAIN2的iFrame。這然後使用查詢字符串來決定如何設置什麼,或;

2)使用method =「POST」的表單,並簡單地發佈到每個域上的文件。

無論哪種方式都是資源密集型的,特別是如果cookie每次更新時都更新。我們也有URL掩蓋。所以我們也必須考慮像abc.clientdomain1.com,abc.clientdomain2.com等網站。

有誰知道一個更簡單的方法來做到這一點?

回答

9

爲您的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 

等等。

+0

這聽起來像它會這樣做 - 不知道是否要這樣做,或者如果表單更容易實現,基於我打算在一週內完成。 – ClarkeyBoy

1

出於安全考慮,網站不能設置或獲取其他域的Cookie。編寫腳本的形式通過javascript提交很可能是最容易做的,仍然會存儲在瀏覽器緩存需要cooikes。

+0

不幸的是,這是我所擔心的;這將會是很多工作,但我認爲這將是非常有益的。在我接受這個答案之前,我會拭目以待其他人是否找到了一個更簡單的方法來做到這一點。 – ClarkeyBoy

2

包括來自DOMAIN2的腳本標籤,設置使用用戶名和哈希密碼餅乾:

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

就可以檢查,以確保散列密碼匹配(單程)。

要點:

  1. 製作的URL時通過散列之前由服務器附加將另行商定時間戳(例如,16:00,16:10,等)敏感的散列字符串。如果您使用的是HTTPS,那麼這不是一個問題。

  2. 如果您的密碼已被散列,那麼假設鹽分在兩臺服務器上都是相同的,那麼雙密碼就不會受到傷害。

示例PHP代碼:

源:

<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 
} 
5

這個答案是一個稍微不同的版本,我對這個問題 「Set cookie on multiple domains with PHP or JavaScript」 的答案。

做Google做的事情。創建一個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> 

然後在標籤添加的onload回調。該文檔只會在圖像完全加載時加載,即在另外兩個域上設置cookie時加載。的onload回調:

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

現在Cookie是在域設置。

Source

+0

我如何發現Google正在做這件事? – chanchal118

+0

@ chanchal118登錄到Google帳戶後,使用開發人員工具檢查網頁 – Subin

0

如前所述別人,你不能跨域訪問的cookie。但是,如果您控制了服務器代碼,則可以在主體中返回信息,並允許客戶端讀取並存儲每個服務器的信息。

在我的情況下,我將一個客戶端連接到多個服務器,並保持每個服務器的認證連接。我需要知道每個會話何時會到期,因此身份驗證服務會返回cookie,並且會修改響應的主體以將相關數據發回,以便我可以讀取該數據並設置自己的Cookie 。

通過這樣做,我可以手動跟蹤我需要什麼。在任何情況下都行不通,但對於像我這樣的人可能會有效。