2011-12-06 31 views
9

Công ty của tôi có một thiết lập như sau:Cookies - thiết trên nhiều lĩnh vực

  • 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

Trên mỗi trang web, nhớ rằng có thể có hàng trăm trang web trên mỗi tên miền phụ, người dùng có thể đăng nhập. Chúng tôi, là nhà phát triển, phải kiểm tra giao diện người dùng trên nhiều trình duyệt, nhưng một số chỉ có thể được yêu cầu trên một phần khi đã đăng nhập.

Tôi đã viết một bản ghi người dùng cho phép chúng tôi lưu tên người dùng và mật khẩu (và các chi tiết khác mà tôi không thể đề cập vì tính bảo mật). Tập lệnh kiểm tra xem tài khoản người dùng có tồn tại không bằng cách điền vào biểu mẫu đăng nhập và nhấp vào nút gửi. Nếu không, nó đăng ký cho chúng tôi - do đó tự động hóa quá trình đăng ký.

Chia sẻ cookie giữa các tên miền phụ trên cùng một tên miền thật dễ dàng. Nếu tôi đang ở trên subdomain1.domain1.com tôi có thể lưu một cookie có thể được truy xuất bởi subdomain2.domain1.com. Tuy nhiên, tôi cũng muốn lưu chúng cho domain2. Tôi dường như không thể làm được điều này.

tôi có thể thấy hai giải pháp từ đây - một trong hai:

1) đính kèm một iFrame sử dụng UserScript, mà tải một trang web trên tên miền 2. Điều này sau đó sử dụng chuỗi truy vấn để quyết định những gì để thiết lập để những gì, hoặc;

2) sử dụng biểu mẫu có phương thức = "POST" và chỉ cần đăng lên một tệp trên mỗi miền.

Dù bằng cách nào sẽ là nguồn lực chuyên sâu, đặc biệt nếu cookie được cập nhật mỗi khi cookie thay đổi. Chúng tôi cũng có mặt nạ URL tại chỗ. Vì vậy, chúng tôi cũng phải tính đến các trang web như abc.clientdomain1.com, abc.clientdomain2.com, v.v.

Có ai biết cách dễ dàng hơn để thực hiện việc này không?

Trả lời

9

Tạo miền chung dành riêng cho cookie của bạn và sử dụng tên miền đó làm API getter/setter.

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

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

v.v.

+0

Điều này nghe như nó sẽ làm - không chắc chắn có nên đi cho điều này hoặc nếu một hình thức sẽ được đơn giản hơn để thực hiện, trên cơ sở mà tôi đang hướng tới để hoàn thành điều này trong vòng một tuần. – ClarkeyBoy

1

Vì lý do bảo mật, trang web không thể đặt hoặc truy xuất cookie trên các tên miền khác. Việc viết biểu mẫu gửi qua javascript có thể là cách dễ nhất để thực hiện và sẽ vẫn lưu trữ các con trỏ bạn cần trong bộ nhớ cache của trình duyệt.

+0

Thật không may đó là những gì tôi sợ; nó sẽ có rất nhiều công việc nhưng tôi nghĩ sẽ rất bổ ích khi thực hiện điều này. Tôi sẽ chờ xem liệu có ai khác đã tìm ra cách dễ dàng hơn để làm điều này trước khi tôi chấp nhận câu trả lời này không. – ClarkeyBoy

2

Bao gồm một thẻ script từ miền 2 để đặt cookie bằng cách sử dụng tên đăng nhập và mật khẩu băm:

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

Sau đó bạn có thể kiểm tra để đảm bảo rằng các mật khẩu băm trận đấu (một chiều).

Những điểm mấu chốt:

  1. Tận dụng tối băm trong thời gian nhạy cảm URL bằng cách thêm một dấu thời gian sẽ được thoả thuận của các máy chủ (ví dụ, 16:00, 16:10, vv) trước khi băm chuỗi. Nếu bạn đang sử dụng HTTPS thì vấn đề này ít hơn.

  2. Nếu mật khẩu của bạn đã được băm, nó sẽ không bị tổn thương khi băm hai lần mật khẩu giả định các muối giống nhau trên cả hai máy chủ.

mẫu mã 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 
} 
5

Câu trả lời này là một phiên bản hơi khác nhau của câu trả lời của tôi về vấn đề "Set cookie on multiple domains with PHP or JavaScript".

Thực hiện những gì Google đang làm. Tạo tệp PHP (hoặc bất kỳ tệp ngôn ngữ máy chủ nào khác) đặt cookie trên tất cả 3 miền. Sau đó, trên miền nơi đăng nhập sẽ được đặt, hãy tạo tệp HTML sẽ tải tệp PHP đặt cookie trên 2 tên miền khác. Ví dụ:

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

Sau đó, thêm một onload callback trên cơ thể thẻ. Tài liệu sẽ chỉ tải khi tải hình ảnh hoàn toàn là khi cookie được đặt trên 2 tên miền khác. Callback onload:

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

Bây giờ cookie được đặt trên ba lĩnh vực.

Source

+0

Làm cách nào để tìm ra Google đang làm điều này? – chanchal118

+0

@ chanchal118 Kiểm tra trang bằng công cụ nhà phát triển khi đăng nhập vào tài khoản Google của bạn – Subin

0

Như đã nêu khác, bạn không thể truy cập cookie trên các tên miền. Tuy nhiên, nếu bạn có quyền kiểm soát mã máy chủ, bạn có thể trả về thông tin trong cơ thể và cho phép khách hàng của bạn đọc và lưu trữ thông tin đó trên mỗi máy chủ.

Trong trường hợp của tôi, tôi đang kết nối một máy khách với nhiều máy chủ, duy trì kết nối được xác thực với từng máy chủ. Tôi cần biết khi nào phiên cho mỗi người sẽ hết hạn, vì vậy dịch vụ xác thực trả về cookie, cộng với việc sửa đổi nội dung phản hồi để gửi dữ liệu liên quan, để tôi có thể đọc dữ liệu đó và đặt cookie của riêng mình .

Bằng cách này, tôi có thể theo dõi thủ công những gì tôi cần. Sẽ không hoạt động trong mọi tình huống, nhưng có thể đối với một số người như tôi.

Các vấn đề liên quan