it-swarm.com.ru

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

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

Но вопрос в том, почему они на МОЕЙ СТРАНИЦЕ

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

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

enter image description here

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

top.sendData({...})

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

  • Как данные передаются из логина FB на мою страницу?
17
Royi Namir

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

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


В зависимости от того, является ли страница 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, в виде всплывающего окна или в виде фрейма, вместо того, чтобы устанавливать новый канал связи между страницей хоста и каждым окном, новые окна могут использовать существующие прокси, не платя при настройке.

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

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

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


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

33
Sean Kinsey

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

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

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

0
majestiq