Facebook автономный доступ шаг за шагом - PullRequest
57 голосов
/ 29 июня 2009

ОБНОВЛЕНИЕ : разрешение Facebook offline_access устарело. Пожалуйста, обратитесь к официальной документации для получения дополнительной информации.
Вы будете иметь до 1 мая 2012 года , на которую эта настройка будет отключен. обратитесь к Путеводителю разработчика для получения дополнительной информации.


После буквально 1 дня поиска в Facebook и Google, чтобы найти актуальный и рабочий способ сделать что-то, казалось бы, простое:

Я ищу пошаговое объяснение, чтобы получить offline_access для пользователя для приложения Facebook, а затем использовать этот (ключ сеанса) для извлечения в автономном режиме, а не из данных о друзьях и профиле браузера.

Желательно делать это в Fb Java API.

Спасибо.

И да, я проверял вики-фейсбук.

Обновление: кто-нибудь?

это: http://www.facebook.com/authorize.php?api_key=<api-key>&v=1.0&ext_perm=offline_access дает мне offline_Access, однако, как получить session_key?

Почему Facebook не может сделать простую документацию, я имею в виду, что там около 600 человек?

Казалось бы, тот же вопрос: Получение offline_access для работы с Facebook Не отвечает, как получить сессионный ключ

Редактировать: Я все еще застрял с этим. Я полагаю, что никто пока не пробовал такой пакетный доступ ...

Ответы [ 7 ]

63 голосов
/ 14 июля 2010

С новым API Graph Facebook все стало немного проще, но гораздо менее хорошо документировано. Вот что я сделал, чтобы иметь возможность загружать свои посты как я только со стороны сервера (не являющейся частью сеанса браузера) php-скрипт:

  1. создайте приложение на Facebook, если у вас его еще нет для этого проекта http://www.facebook.com/developers/apps.php#!/developers/createapp.php - и включите режим песочницы / разработчика! @ Расширенные настройки> Режим песочницы> Включить (позволяет видеть это только разработчикам приложения). Вам понадобятся идентификатор приложения (APP_ID) и секретный ключ (SECRET_KEY), которые указаны в сводке учетной записи разработчика этого приложения, но не старый ключ API.

  2. загрузите в свой браузер, уже войдя в систему fb как учетную запись, к которой вы хотите подключить приложение на стороне сервера, и нажмите «разрешить» для запрашиваемых разрешений: https://graph.facebook.com/oauth/authorize?client_id=APP_ID&scope=offline_access,read_stream&redirect_uri=http://www.facebook.com/connect/login_success.html

  3. скопировать параметр "code" из результирующей строки запроса URL, используйте его в: https://graph.facebook.com/oauth/access_token?client_id=APP_ID&redirect_uri=http://www.facebook.com/connect/login_success.html&client_secret=APP_SECRET&code=CODE_FROM_2 И скопируйте правую часть access_token = в тексте получившейся страницы, который будет иметь структуру: APP_ID | HEXNUM-USER_ID | WEIRD_KEY

  4. теперь загружайте из API api или классического API остальных, используя токен доступа к присяге, который вы только что получили (где SOURCE_ID - идентификатор Facebook для пользователя / группы / того, что вы ищете):

    <?php
    $stream = json_decode(file_get_contents("https://api.facebook.com/method/stream.get?source_ids=SOURCE_ID&access_token=ACCESS_TOKEN&format=json"));
    var_dump($stream);
    // this one gives a 500 internal server error from the http get if any of the fields are invalid, but only in php, not when loaded in a browser... weird.
    $feed = json_decode(file_get_contents("https://graph.facebook.com/SOURCE_ID/feed?fields=id,from,created_time,link,type&access_token=ACCESS_TOKEN"));
    var_dump($feed);
    ?>
    

Отмечая, что API api и остальные API возвращают не только разные структуры, но и разную информацию - поэтому здесь я предпочитаю результаты из API остальных (первого), хотя мне нравится возможность ограничивать поля в новый график API (второй).

Посмотрите http://developers.facebook.com/docs/authentication/ в разделах «Запрос расширенных разрешений» и «Аутентификация пользователей в веб-приложении» для получения официальных (разреженных) сведений.

Если вы хотите делать это регулярно, то есть программно, вот автоматизированная версия шагов 2 + 3:

Поместите это на свой веб-сервер как "facebook_access_token.php":

<?php $token = explode('=', file_get_contents("https://graph.facebook.com/oauth/access_token?client_id=APP_ID&redirect_uri=http://$_SERVER[SERVER_NAME]$_SERVER[PHP_SELF]&client_secret=APP_SECRET&code=" . 
(get_magic_quotes_gpc() ? stripslashes($_GET['code']) : $_GET['code']))); 
echo $token[1]; 
// store this, the access token, in the db for the user as logged in on your site -- and don't abuse their trust! ?>

И направлять пользователей в своих браузерах на: https://graph.facebook.com/oauth/authorize?client_id=APP_ID&scope=offline_access,read_stream&redirect_uri=http://www.example.com/facebook_access_token.php

11 голосов
/ 28 мая 2011

Если вы, наконец, хотите использовать PHP, с Facebook PHP SDK v3 ( смотрите на github ), это довольно просто. Чтобы войти в систему с разрешением offline_access, вы спрашиваете его при создании URL-адреса для входа. Вот как ты это делаешь.

Получить токен автономного доступа

Сначала вы проверяете, вошел ли пользователь в систему:

require "facebook.php";
$facebook = new Facebook(array(
    'appId'  => YOUR_APP_ID,
    'secret' => YOUR_APP_SECRET,
));

$user = $facebook->getUser();

if ($user) {
  try {
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    $user = null;
  }
}

Если это не так, вы генерируете URL "Логин с Facebook", запрашивая разрешение offline_access:

if (!$user) {
    $args['scope'] = 'offline_access';
    $loginUrl = $facebook->getLoginUrl($args);
}

А затем отобразите ссылку в вашем шаблоне:

<?php if (!$user): ?>
    <a href="<?php echo $loginUrl ?>">Login with Facebook</a>
<?php endif ?>

Затем вы можете получить токен автономного доступа и сохранить его. Чтобы получить его, позвоните:

if ($user) {
    $token = $facebook->getAccessToken();
    // store token
}

Использовать токен автономного доступа

Чтобы использовать токен автономного доступа, когда пользователь не вошел в систему:

require "facebook.php";
$facebook = new Facebook(array(
    'appId'  => YOUR_APP_ID,
    'secret' => YOUR_APP_SECRET,
));

$facebook->setAccessToken("...");

И теперь вы можете делать вызовы API для этого пользователя:

$user_profile = $facebook->api('/me');

Надеюсь, это поможет!

6 голосов
/ 03 октября 2009

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

РЕДАКТИРОВАТЬ: сообщение больше не существует. FB API обновляется в любом случае ...

5 голосов
/ 19 июля 2011

Вы хотите начать с чтения раздела Server Side Flow в руководстве по аутентификации. Начнем с этого URL:

https://www.facebook.com/dialog/oauth

Добавьте свой идентификатор приложения ( доступно здесь ) к URL-адресу, который на языке OAuth равен client_id:

https://www.facebook.com/dialog/oauth?client_id=184484190795

Добавьте разрешение offline_access или scope на языке OAuth:

https://www.facebook.com/dialog/oauth?client_id=184484190795&scope=offline_access

Добавьте redirect_uri, куда Facebook будет перенаправлять после того, как пользователь завершит этап авторизации («Разрешить» или «Не разрешать», посмотрите документацию на формат ответа или просто попробуйте):

https://www.facebook.com/dialog/oauth?client_id=184484190795&scope=offline_access&redirect_uri=https%3A%2F%2Ffbrell.com%2Fecho

Если вы перейдете по ссылке выше , вы получите приглашение, а затем, нажав Allow / Dont Allow, перейдете на страницу, которая «повторяет» запрос. Если вы нажмете «Разрешить», вы получите обратно параметр code, который вы можете обменять на access_token, отправив HTTP-запрос в Facebook с вашего сервера, что-то вроде этого:

https://graph.facebook.com/oauth/access_token?client_id=184484190795&client_secret=XXX&code=YYY&redirect_uri=ZZZ

Вам необходимо передать client_id, ваш секрет приложения должен быть передан как client_secret, то же самое redirect_uri, как вы использовали ранее, и code, которое вы получили как ответ. Это вернет offline_access enabled access_token для этого пользователя.

Однако следует иметь в виду, что даже если вы запрашиваете offline_access, ваше приложение должно корректно обрабатывать недействительные или просроченные access_tokens, как это может происходить по разным причинам.

3 голосов
/ 01 сентября 2009

Я знаю два решения: Java и JavaScript

Java: а. код сервлета (не забудьте импортировать соответствующие банки):

String url="http://www.facebook.com/login.php?api_key=YOUR_API_KEY&v=1.0";
url+="&fbconnect=true&return_session=true&req_perms=offline_access,status_update";
url+="&next=http://YOUR_FaceBookCallback_SERVLET"; 
response.sendRedirect(url);
return;

// Вы получите приглашение войти в Facebook и разрешить расширенные разрешения

б. Не забудьте определить свой ConnectUrl (в приложении для учетной записи Facebook) как http://YourUrlFromWhereDoYouTurnToTheServletAbove

с. создайте другой сервлет: YOUR_FaceBookCallback_SERVLET (см. выше) с этим кодом:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String session = request.getParameter("session");
//from this string you can obtain your infinite session_key.In order to do this, parse this string as JSON.
//Save it in the database or in the other data storage  
response.sendRedirect(ThePlaceThatYouWant);}

д. Используйте этот секретный сессионный ключ, как это:

FacebookXmlRestClient  client = new FacebookXmlRestClient(YOUR_API_KEY, FACEBOOK_APPLICATION_SECRET,SECRET_SESSION_KEY);
client.setIsDesktop(false); 
client.users_setStatus("YourMessage");

Если кому-то нужно решение JavaScript (большая дыра в безопасности), напишите мне

2 голосов
/ 05 ноября 2009

Я разобрался, как «извлечь» ключ бесконечного сеанса автономного доступа после долгих волнений, проб и ошибок и размышлений обо всех других продуктивных способах, которые я мог бы потратить на это время ... согласен, документация на Facebook могла быть намного лучше

1) Если вы используете facebook-java-api ..., посмотрите на демонстрационном сайте facebook для "мобильной сети", как отформатировать URL для запроса автономного доступа
http://itsti.me/index.php

<a href="http://www.facebook.com/connect/prompt_permissions.php?api_key=YOUR_API_KEY&ext_perm=publish_stream%2Coffline_access&next=http%3A%2F%2Fmysite%2Ffacebookconnect&cancel=http%3A%2F%2Fmysite%2Fhome&display=wap"><img alt="Connect" src="http://static.ak.fbcdn.net/images/fbconnect/login-buttons/connect_light_medium_long.gif" id="fb_login_image"/></a>

2) Что касается того, как получить автономный ключ сеанса из сеанса ... Хитрость заключается в том, что когда Facebook перенаправляет пользователя на следующий URL-адрес сразу после предоставления доступа в автономном режиме, вы должны получить сеанс Facebook снова. этот новый сеанс будет иметь бесконечный сеансовый ключ.
Вот пример для мобильного Интернета ... Вы должны быть в состоянии выяснить это для обычного веб-сайта. Auth_token используется только для мобильных веб-сайтов ... он может не понадобиться для обычного веб-сайта

FacebookJsonRestClient fbc = new FacebookJsonRestClient(MY_API_KEY, SECRET, sessionKey);
String auth_token = request.getParameter("auth_token");
System.out.println("infinite session kEY = " +   fbc.auth_getSession(auth_token));
0 голосов
/ 29 января 2011

Для доступа к сеансу мне пришлось использовать loginurl, предоставленный php api facebook, так как в запросе на аутентификацию он отправляет 2/3 дополнительных переменных, включая return_session и session_version. Также новый php5-sdk отправляет запрос на login.facebook.com вместо https://graph.facebook.com/oauth/authorize. Вот как я это сделал:

$b=new facebook(array('appId'=>APP_ID,'secret'=>SECRET))

Чтобы запросить аутентификацию:

$facebook->getLoginUrl(array('next'=>$redirect_uri,'req_perms'=>$scope))

Помните, чтобы включить offline_access в $ scope. Как только вы будете перенаправлены на эту страницу (после входа в систему на fb и предоставления разрешений) у вас будет $ _GET ['session'] в формате json.

Просто храните его где угодно (я делаю это в базе данных). В следующий раз, когда вы захотите что-то сделать с учетной записью пользователя, просто используйте следующее:

$session = json_decode($db->query("SELECT ..."));//get session from db $this->facebook->setSession($session);

После этого любые запросы, которые делает API, будут через доступ этого пользователя.

Самое плохое в текущем API-интерфейсе графа Facebook (поправьте меня, если я ошибаюсь), что текущий API игнорирует сессию (которая кажется остатком от старого API) во всей своей документации и говорит только о access_token. Но текущий API (php5-SDK) не имеет функции для отправки фактического запроса, используя только access_token. Если есть функция для запуска сеанса с использованием только access_token, я не знаю об этом.

...