Backend-авторизация в facebook через OAuth 2.0

Facebook Graph API - новая версия программного интерфейса фейсбука где данные пользователя передаются в JSON формате, а список связанных объектов и привилегий значительно понятней (друзья, фото, видео, события, группы, посещения, события и тп. ). Например так выглядит информация обо мне (я чуток урезал).

{ "id": "712392972", "name": "Artjom Kurapov", "first_name": "Artjom", "last_name": "Kurapov", "link": "http://www.facebook.com/artkurapov", "about": "http://kurapov.name", 
   "verified": true,
}

Впрочем проблем с прошлого раза не убавилось и каша как со стандартами, так и с документацией остаётся - API меняется так часто, что документация в wiki не поспевает, интернет полон старых решений и разобраться в элементарных вещах не так то просто.


Связка

Если в твиттере OAuth основана на подписях, то фейсбук решил упростить себе работу и для безопасности канала просто используется SSL соединение. Допустим моё приложение хочет в фоновом режиме синхронизировать события из моего сайта с моими событиями в фейсбуке. Это значит что надо зарегистрировать приложение, авторизовать по OAuth доступ приложению к своим данным и потом в фоновом режиме делать синхронизацию. Теперь посмотрим в деталях как выглядят последние два пункта..

  1. Ставим URL приложения. Копируем appId и secret к себе в код - это наш ключ приложения (consumer key)
  2. Проверяем в приложении есть ли у нас сохранённый где-то access key и если нет то редиректим пользователя на https://graph.facebook.com/oauth/authorize с параметрами 
    • client_id - приложение
    • redirect_uri - куда вернуться
    • scope - прав, мне к примеру понадобятся постоянный доступ и создание событий (offline_access, create_event)
  3. Пользователь получает диалог, подтверждает и возвращается к нам с code параметром - ключём запроса, который мы обменяем на ключ доступа (access key) по https://graph.facebook.com/oauth/access_token, передав следующие данные...
    • client_id
    • client_secret
    • code
    • redirect_uri
    • Если вы передадите ещё и type=client_cred то ключ доступа будет урезанным (вида 134790075639751|e9PC-PhvPnOvlVbgbLmITd24hnQ) и вы будете действовать не столько от имени пользователя, сколько от имени приложения. Поэтому лучше этот параметр не указывать и получать полный ключ (вида  134790075639751|ad22e11d67b06933774e26da-712393972|D8PoAPDdvv8onIAf_CasljjK7Pk )
В общем основная часть примерно так выглядит..

if(!$token){ if($_REQUEST['code']){ $token = file_get_contents('https://graph.facebook.com/oauth/access_token?client_id='.CONSUMER_KEY.'&client_secret='.CONSUMER_SECRET.'&code='.$_REQUEST['code'].'&redirect_uri='.CONSUMER_URL); } else header('Location: https://graph.facebook.com/oauth/authorize?client_id='.CONSUMER_KEY.'&scope=offline_access,create_event,publish_stream,user_events&redirect_uri='.CONSUMER_URL); }
Заметьте, что если вы пытаетесь получить события пользователя, но не спросили прав то данные будут пустые. Получив ключ доступа, можно спокойно спрашивать данные о пользователе, обновлять и синхронизировать события как и задумывалось.

По теме..
oauth_facebook.png oauth_facebook2.png oauth_facebook3.png
RSS

Комментарии

  • делаю запрос прав редиректом на https://graph.facebook.com/oauth/authorize?
    у меня приложение настроено, так
    Canvas Type -IFrame
    IFrame Size -Show scrollbars
    JSON Encoding Empty Arrays — Enabled
    November 2010 Rollup -Enabled

    при этом, после редиректа во фрейме приложения отображается какой то кусок шапки facebook.com и все
    догался посмотреть в браузере «фрейм->открыть в новой вкладке» — в новой вкладке отлично отображается искомый диалог «Запрос доступа»
    получается после редиректа не страбатывает какой то js для отрисовки диалога.

    не сталкивались с таким?
    спасибо
  • Редирект имеет смысл делать во внешних приложениях где по минимуму нужен UI. Для ориентированных на UI внешних и на canvas-приложениях надо использовать JS sdk
    http://developers.facebook.com/docs/reference/javascript/
  • baleew
    avatar
    Артём, прошу прощения, что в такой старый пост, но ничего больше не нашёл даже близкого к теме. Посоветуйте пожалуйста, как быть моей ситуации? Суть такова: всё по сути ясно, всё работает как и ожидается, но только если это проделывать с Opera -- возникат проблема. На самом интересном месте он вдруг замирает (не вдаваясь в подробности), на этапе 3, в случае если права уже предоставлены приложению ранее или пользователь отказывает, почему-то не хочет сделать редирект и строит станицу которую отдаёт сервер "как есть", т.е. -- ничего. Ни кто не знает как эту болезнь лечить в Opera, потому надо городить всякое. Не посоветуете ли Вы какой-то другой способ получить параметр code?
  • Ильмир
    avatar
    Полезный блог, но я ничего не понял. Запутался в открытии приложения