Facebook i Cross domain messaging?

Chciałem zbadać, w jaki sposób login facebook przenosi dane do strony głównej ( mypage) - pomimo ograniczenia granicy domen.

I tak stworzyłem nową stronę o kodzie FB js sdk:

FB.login(function (response)
    {
    if (response.authResponse)
        {...

Otwiera wyskakujące okienko:

Tutaj wpisz opis obrazka

Ale kiedy sprawdzałem, czy mam jakieś Iframes NA MOJEJ STRONIE (mój kod nie zawiera żadnych iframes):

Widziałem to:

>>$("iframe")

Wynik:

[
<iframe name=​"fb_xdm_frame_http" frameborder=​"0" allowtransparency=​"true" scrolling=​"no" id=​"fb_xdm_frame_http" aria-hidden=​"true" title=​"Facebook Cross Domain Communication Frame" tab-index=​"-1" src=​"http:​/​/​static.ak.facebook.com/​connect/​xd_arbiter.php?version=24#channe…l_path=%2FWebSite2%2FHTMLPage3.htm%3Ffb_xd_fragment%23xd_sig%3Df5252874%26" style=​"border:​ none;​">​…​</iframe>​
, 
<iframe name=​"fb_xdm_frame_https" frameborder=​"0" allowtransparency=​"true" scrolling=​"no" id=​"fb_xdm_frame_https" aria-hidden=​"true" title=​"Facebook Cross Domain Communication Frame" tab-index=​"-1" src=​"https:​/​/​s-static.ak.facebook.com/​connect/​xd_arbiter.php?version=24#cha…l_path=%2FWebSite2%2FHTMLPage3.htm%3Ffb_xd_fragment%23xd_sig%3Df5252874%26" style=​"border:​ none;​">​…​</iframe>​
]

Czytałem, że są one używane do cross domain.

Ale pytanie dlaczego są one NA MOJEJ STRONIE ?

Powinny być gdzieś na wewnętrznych stronach facebook!

Mówię to, ponieważ Wiem, że Technika Iframe działa tak:

Tutaj wpisz opis obrazka

Jak widać - wewnętrzny Iframe tworzy kolejny iframe z wartością SRC z łańcucha zapytania ( w rzeczywistości jest to adres URL górnej strony), a następnie z JS na obu stronach + URL => JS trigger funkcje, możemy wykonać:

top.sendData({...})

Co mi umyka ?
  • jak dane są przekazywane z loginu FB na moją stronę ?
Author: Royi Namir, 2013-05-31

2 answers

Jestem inżynierem, który zaprojektował obecną infrastrukturę do przesyłania wiadomości między domenami w SDK Facebook js, więc może mógłbym rzucić trochę światła na rzeczy tutaj.

[[4]} Ta konfiguracja może wydawać się trochę niekonwencjonalna i myląca dla niektórych, ale jest naprawdę elegancka, jeśli mogę tak powiedzieć:)

W zależności od tego, czy strona jest HTTP, czy HTTPS, JS SDK utworzy dwa ramki iFrame, wskazujące na xd_arbiter.zasób php, który jest obsługiwany z *.facebook.com domena. Ponieważ ustawia document.domain = 'facebook.com', mogą komunikować się z innymi zasobami na facebook.com to robi to samo.

Te zasoby, proxy, są przekazywane przez fragment, aby dać im dynamiczne możliwości, ale poza tym są w 100% statyczne i buforowane przez przeglądarkę - więc są naprawdę szybkie do załadowania.

To, co dzieje się dalej, to że między stroną hosta a każdym z iframes (proxy) tworzony jest Łącze do przesyłania wiadomości między domenami. Oznacza to, że od teraz strona hostująca może komunikować się ze stroną HTTPS na facebook.com, a jeśli strona hosta to HTTP, może również komunikować się ze stroną HTTP na facebook.com.

Sposób działania tego linku w przeglądarkach jest bardziej złożony, ale wszystko jest abstrakcyjne w kanale, podobnie jak można zobaczyć w easyXDM.


Teraz, gdy JS SDK tworzy nowe okno na facebook.com jako wyskakujące okienko lub ramka iframe, zamiast konieczności konfigurowania nowego kanału komunikacji między stroną hosta a każdym okno, nowe okna mogą korzystać z istniejącego serwera proxy, nie płacąc żadnych kosztów w konfiguracji.

Gdy trzeba wysyłać wiadomości na stronę hosta, będą one używać (window.opener || window.parent).frames['fb_xdm_frame_' + location.protocol.replace(':', ''), Aby uzyskać uchwyt do proxy, i podobnie, proxy może używać parent.frames[some_name], aby uzyskać uchwyt do dowolnych ramek iFrame rodzeństwa na stronie, o ile odpowiedni proxy (HTTP lub HTTPS) był używany.

Dla nas oznacza to zasadniczo, że troska o to, jak komunikować się między domenami, jest odizolowana od JS SDK i jego zasobów - wszelkich usług, które budujemy ponadto może polegać na bardzo prostym api send_this_message(message, origin) i "magicznie" skończy na drugim końcu, jeśli pozwoli na to kontrola pochodzenia, którą mamy na miejscu.

Mam nadzieję, że to odpowiedź na twoje pytanie!


(xd_arbiter.php może również służyć jako cel przekierowania, gdzie będzie używał swoich proxy rodzeństwa do przekazywania wiadomości).

 32
Author: Sean Kinsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-31 20:40:29

Myślę, że koncepcja może być prosta w oparciu o if you ' re ie8+ w kodzie.

CORS może być używany do komunikacji między domenami. Upewnij się, że odpowiednie nagłówki są ustawione na Twoim gospodarzu i jesteś dobry.

Lub, utwórz ramkę iframe, ustaw jej src jako coś, co przekazuje informacje do dynamicznego skryptu. Przetwarzaj informacje. Zwraca kod JS do ramki iframe, która używa postMessage do komunikacji z oknem zewnętrznym.

 0
Author: majestiq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-13 22:11:38