2011-01-15 36 views
58

Tôi đang duyệt tài liệu của Facebook đọc về các ứng dụng canvas và tôi đã xem một ứng dụng ví dụ: http://developers.facebook.com/docs/samples/canvas. Như tôi đã đọc qua ví dụ của họ, tuy nhiên, tôi đã rất bối rối về việc họ sử dụng cookie trong ứng dụng khung nội tuyến.Facebook đặt cookie tên miền chéo cho iFrames trên trang canvas như thế nào?

Một cốt truyện chút ...

tôi đã chơi xung quanh với việc sử dụng iframe cho widget nhúng (không liên quan đến Facebook) và tôi phát hiện ra một vài trình duyệt (Chrome, Safari, vv) có chính sách nghiêm ngặt và Cookie không cho phép cookie nhiều miền được đặt trong khung nội tuyến (Firefox, mặt khác, cho phép iframe đặt cookie trong miền chéo trong iframe). Ví dụ: nếu foo.com có ​​iframe có src="http://bar.com/widget" tiện ích iframe sẽ không thể đặt bất kỳ cookie nào cho bar.com và do đó sẽ gặp sự cố trạng thái tồn tại trong iframe: bar.com sẽ giải thích mọi yêu cầu (bao gồm yêu cầu ajax) từ tiện ích dưới dạng yêu cầu mới mà không có phiên được thiết lập. Tôi gặp khó khăn, và tìm thấy một cách xung quanh điều này bằng cách sử dụng JSONP và javascript để đặt cookie cho foo.com thay thế ...

... và như vậy?

Vâng, tôi đang xem ứng dụng Facebook khung nội tuyến canvas và tôi nhận thấy rằng ứng dụng của họ (được lưu trữ trên runwithfriends.appspot.com) có thể đặt cookie, u, với id người dùng hiện tại cùng với một số khác tham số cho miền runwithfriends.appspot.com. Nó sẽ gửi cookie này với mọi yêu cầu ... và nó hoạt động trong cả Chrome và Firefox! WTF? Facebook làm cách nào để tránh các hạn chế cookie đa miền trên Chrome?

(Tôi đã biết câu trả lời bây giờ, nhưng tôi nghĩ rằng điều này có thể hữu ích cho bất cứ ai đang gặp khó khăn để tìm ra điều tương tự -. Tôi sẽ gửi câu trả lời dưới đây)

+0

Cập nhật: phiên bản mới nhất của một số trình duyệt (Safari v6.x + trên OS X, Safari trên iOS 6+, và tôi giả định Chrome và FF sớm) không cho phép đặt cookie nhiều miền nữa, ngay cả khi yêu cầu post-to-iframe. –

Trả lời

59

Vì vậy iFrame không phải là thực sự đặt cookie u cho miền runwithfriends.appspot.com. Những gì Facebook làm là nó tạo ra một hình thức, <form action="runwithfriends.appspot.com/..." target="name_of_iframe" method="POST"> và sử dụng javascript để gửi biểu mẫu khi tải trang. Vì mục tiêu của biểu mẫu là iframe, nên nó không tải lại trang ... nó chỉ tải iframe với phản hồi của POST. Dường như ngay cả Chrome và các trình duyệt khác có chính sách cookie nghiêm ngặt đặt cookie cho các yêu cầu miền chéo nếu chúng là yêu cầu POST ...

+2

Tôi đã tạo bằng chứng về khái niệm về ứng dụng sinatra để minh họa cách thức hoạt động này: https://github.com/agibralter/iframe-widget-test –

+0

Hey Aaron, Bạn có phiên bản Javascript thuần túy của mã/demo này không? – lshettyl

+2

@LShetty - xin lỗi, tôi không chắc tôi hiểu ý của bạn ... Javascript thuần túy? Phần Ruby của bản demo đóng vai trò là máy chủ web ... bạn có muốn xem bản demo được viết bằng Node.js không? –

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