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:
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:
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({...})
- jak dane są przekazywane z loginu FB na moją stronę ?
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).
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.
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