Профили обмена сообщениями в Facebook и кросс-доменах? - программирование
Подтвердить что ты не робот

Профили обмена сообщениями в Facebook и кросс-доменах?

Я хотел исследовать, как данные входа в facebook переходят на главную страницу (mypage) - несмотря на ограничение границы между доменами.

И поэтому я создал новую страницу с кодом FB js sdk:

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

Открывает всплывающее окно:

enter image description here

Но когда я исследовал, есть ли у меня iframes на моей странице (мой код не содержит никаких iframes):

Я видел это:

>>$("iframe")

результат:

[
<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>​
]

Я читал, что они используются для кросс-домена.

Но вопрос в том, почему они на MY PAGE?

Они должны быть где-то на внутренних страницах facebook!

Я говорю это, потому что знаю, что техника Iframe работает следующим образом:

enter image description here

Как вы можете видеть - внутренний iframe создает другой iframe с значением SRC из строки запроса (фактически это URL-адрес верхней страницы), а затем с JS на обеих страницах + URL => JS триггерные функции, мы может:

top.sendData({...})

Что мне не хватает?

  • Как данные передаются из входа FB на мою страницу?
4b9b3361

Ответ 1

Я инженер, который разработал существующую инфраструктуру для обмена междоменными сообщениями в SDK Facebook JS, поэтому, возможно, я могу пролить свет на вещи здесь.

Эта установка может показаться немного неортодоксальной и запутанной для некоторых, но она очень изящна, если можно так сказать:)


В зависимости от того, является ли страница HTTP или HTTPS, JS SDK создаст два iframe, указывая на ресурс xd_arbiter.php, который подается из домена *.facebook.com. Поскольку он устанавливает document.domain = 'facebook.com', они могут взаимодействовать с другими ресурсами на facebook.com, которые делают то же самое.

Эти ресурсы, прокси-серверы, передают некоторую информацию через фрагмент, чтобы дать им динамические возможности, но в противном случае 100% статичны и кэшированы вашим браузером - так что они очень быстро загружаются.

Что происходит дальше, так это то, что между главной страницей и каждым из фреймов (прокси) установлена ​​связь между доменами. Это означает, что с этого момента страница узла может связываться с HTTPS-страницей на facebook.com, а если главной страницей является HTTP, она также может связываться с HTTP-страницей на facebook.com.

Как эта ссылка работает в браузерах, это более сложный вопрос, но все это абстрагируется в канал, как вы можете видеть с помощью easyXDM.


Теперь, когда JS SDK создает новое окно на facebook.com, либо как всплывающее окно, либо как iframe, вместо того, чтобы настраивать новый канал связи между главной страницей и каждым окном, новые окна могут использовать существующий прокси-сервер, не затрачивая при этом никаких затрат.

При необходимости отправки сообщений на главную страницу они будут использовать (window.opener || window.parent).frames['fb_xdm_frame_' + location.protocol.replace(':', ''), чтобы получить дескриптор прокси-сервера, и аналогичным образом прокси-сервер может использовать parent.frames[some_name], чтобы получить дескриптор для любых фреймов sibling на странице, так как если используется правильный прокси (HTTP или HTTPS).

Для нас это в основном означает, что забота о том, как общаться в кросс-домене, изолирована от JS SDK и его ресурсов - любые сервисы, которые мы строим поверх этого, могут опираться на очень простой api send_this_message(message, origin), и это будет "магически" заканчиваться на другом конце, если это разрешено проверками происхождения, которые у нас есть.

Надеюсь, это ответит на ваш вопрос!


(xd_arbiter.php также может служить целью перенаправления, где он будет использовать его sibling proxies для передачи сообщения).

Ответ 2

Я думаю, что концепция может быть простой, если вы используете ie8 + в своем коде.

CORS может использоваться для связи кросс-домена. Убедитесь, что правильные заголовки установлены на вашем хосте, и вы хорошо.

Или создайте iframe, установите его src как нечто, передающее информацию динамическому script. Обработать информацию. Верните JS-код в iframe, который использует postMessage для связи с внешним окном.