[Facebook] механизм авторизации на сторонних сайтах

djon1

Приведенный ниже код с помощью Facebook javascript SDK выводит id пользователя в фейсбуке, если он залогинин в браузере в фейсбуке.
     FB.init({
     appId:'app_id',
cookie:true,
     status: true,
     xfbml:true
     });
    
     FB.getLoginStatus(function(response){
if (response.session){
//alert("hey");
alert(response.session.uid);
} else{
alert(response.status);
}
})
Вопрос, разбирался ли кто-нибудь как они это делают?
Мое понимание: чтобы понять залогин ли пользователь в фейсбуке нужно посмотреть куки для facebook.com, для этого видимо создается временный iframe к домену facebook.com на котором получается доступ к кукисам и основная страничка с iframe каким-то образом обмениваются информацией.

djon1

Вроде все так и работает, но получается что можно в основном документе подгрузить к примеру mail.ru, внедрить в iframe javascript с основной страницы и получить доступ к cookies от mail.ru на левом сайте. Как то небезопасно получается...

doublemother

Мое понимание: чтобы понять залогин ли пользователь в фейсбуке нужно посмотреть куки для facebook.com, для этого видимо создается временный iframe к домену facebook.com на котором получается доступ к кукисам и основная страничка с iframe каким-то образом обмениваются информацией.
Ужасы какие. Нельзя обменяться информацией с айфреймом.
Скорее всего, в js вызывается скрипт (тупо <script src="http://facebook..." /> который обращается к фейсбуку с фейсбуковыми же куками — сама страница о них, как и положено, ничего не знает. Фэйсбук в свою очередь возвращает формочку или что там положено для комментов и прочей хреноты.

djon1

Ужасы какие. Нельзя обменяться информацией с айфреймом.
Вот такой iframe появляется, затем исчезает
<iframe id="f3ad73f734" name="f1be14b5e4" scrolling="no" style="border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; overflow-x: hidden; overflow-y: hidden; " class="FB_UI_Hidden" src="http://www.facebook.com/extern/login_status.php?api_key=119603568109610&amp;app_id=119603568109610&amp;display=hidden&amp;extern=2&amp;locale=en_US&amp;method=auth.status&amp;next=http%3A%2F%2Fstatic.ak.fbcdn.net%2Fconnect%2F_proxy.php%23cb%3Df1130e3af8%26origin%3Dhttp%253A%252F%252Flocalhost%252Ffc3bba874%26relation%3Dopener%26transport%3Dpostmessage%26frame%3Df13003bdb4%26result%3D%2522xxRESULTTOKENxx%2522&amp;no_session=http%3A%2F%2Fstatic.ak.fbcdn.net%2Fconnect%2F_proxy.php%23cb%3Df11e68d24c%26origin%3Dhttp%253A%252F%252Flocalhost%252Ffc3bba874%26relation%3Dparent%26transport%3Dpostmessage%26frame%3Df13003bdb4&amp;no_user=http%3A%2F%2Fstatic.ak.fbcdn.net%2Fconnect%2F_proxy.php%23cb%3Dfa427cdd4%26origin%3Dhttp%253A%252F%252Flocalhost%252Ffc3bba874%26relation%3Dparent%26transport%3Dpostmessage%26frame%3Df13003bdb4&amp;ok_session=http%3A%2F%2Fstatic.ak.fbcdn.net%2Fconnect%2F_proxy.php%23cb%3Df345703f4%26origin%3Dhttp%253A%252F%252Flocalhost%252Ffc3bba874%26relation%3Dparent%26transport%3Dpostmessage%26frame%3Df13003bdb4&amp;sdk=joey&amp;session_version=3"></iframe>

solovushka

может скрипт в этом ифрейме делает window.postMessage родителю со словами "все ок, он авторизован".?
посмотри исходный текст то по ссыле
http://www.facebook.com/extern/login_status.php?api_key=1196...

djon1

Ужасы какие. Нельзя обменяться информацией с айфреймом.
Нашел, что все же обмениваться с айфреймом информацией можно(передавая в iframe свой url в запросе) меняя в ссылках друг друга fragmentID http://example.com/blah#fragmentID, при смене fragmentID не происходит перегрузок страницы и получается обмен информацией. Но facebook видимо в iframe посылает cookies на сервер с каким-нить token, а потом в основной странице запрашивает информацию о логине пользователя вместе с этим token через HTTP POST.

djon1

может скрипт в этом ифрейме делает window.postMessage родителю со словами "все ок, он авторизован".?
видимо там без HTML 5, ну во всяком случае postMessage там не видно

rosali

> получается что можно в основном документе подгрузить к примеру mail.ru, внедрить в iframe javascript с основной страницы
O_o если iframe с mail.ru то в нем только те скрипты которые mail.ru же и захотел чтобы там были. в общем никакой глобальной проблемы с безопасностью в интернете нет (кто бы мог подумать!). facebook js SDK это не какой-то молодец со стороны взял и написал, это API предоставляемое _facebook_-ом, через него доступно только то что _facebook_ счел допустимым, login например доступен а сама авторизационная кука нет. в этом API конешно могут быть дыры, но это уже отдельный вопрос.

Hastya

Мое понимание: чтобы понять залогин ли пользователь в фейсбуке нужно посмотреть куки для facebook.com, для этого видимо создается временный iframe к домену facebook.com на котором получается доступ к кукисам и основная страничка с iframe каким-то образом обмениваются информацией.
Для сторонних сайтов нет понятия "залогинен в FB". Есть понятие "пользователь разрешил доступ приложению X". Без согласия пользователя его данные получить нельзя.
Технически, JavaScript API сначала получает access_token от FB, затем создает на внешнем сайте cookie постоянной авторизации (fbs_NNNN). fbs cookie имеет чисто информативное назначение и не дает никакого преимущества помимо запоминания user id.
Оставить комментарий
Имя или ник:
Комментарий: