Вход в Facebook Oauth 2.0 с использованием PHP 3.1.1 и Javascript SDK - PullRequest
2 голосов
/ 24 октября 2011

Я пытаюсь перейти на новый Facebook API для веб-сайтов, но просто не могу заставить его работать гладко. Я хотел бы использовать Javascript и PHP SDK вместе, но у меня проблемы. Я могу авторизоваться, но страница не обновляется автоматически.

Я искал в SO и документации Facebook, но все еще не могу заставить это работать правильно. Я прочитал http://developers.facebook.com/blog/post/534/,, загрузил последнюю версию PHP SDK (3.1.1) и скопировал пример из вышеупомянутого поста из Facebook. Я сделал правильные настройки в настройках «Миграция» моего приложения, но это может быть причиной проблемы. Я не могу опубликовать изображение, поэтому вот настройка:

  • Удалить устаревшие API: включено
  • Принудительно использует секретный логин: включено
  • токен зашифрованного доступа: включен
  • Расширенный диалог авторизации: включен
  • (все остальное отключено)

Вот код:

<code><?php

require 'php-sdk/src/facebook.php';

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

// See if there is a user from a cookie
$user = $facebook->getUser();

if ($user) {
  try {
  // Proceed knowing you have a logged in user who's authenticated.
  $user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
  echo '<pre>'.htmlspecialchars(print_r($e, true)).'
'; $ user = null; } } ?> <! DOCTYPE html> <? php if ($ user_profile) {?> Ваш профиль пользователя
            
         <?php print htmlspecialchars(print_r($user_profile, true)) ?>
      
<? php} else {?> <Фб: войти кнопки> </ FB: войти кнопки> <? php}?>
window.fbAsyncInit = function () { FB.init ({ appId: '<? php echo $ facebook-> getAppID ()?>', cookie: правда, xfbml: true, oauth: правда }); FB.Event.subscribe ('auth.login', function (response) { window.location.reload () }); FB.Event.subscribe ('auth.logout', function (response) { window.location.reload (); }); }; (function () { var e = document.createElement ('script'); e.async = true; e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; document.getElementById ( 'FB-корень') AppendChild (е). } ());

1 Ответ

4 голосов
/ 25 октября 2011

Я собирался написать это как комментарий, но он стал немного длиннее ...:)

Несколько указателей, использующих PHP SDK:

$facebook->getUser(); 

Это будет работать независимо от аутентификации. getUser () извлекает общедоступные данные, для которых не требуется токен доступа, ОДНАКО, если у вас есть токен доступа, а пользователь предоставил разрешения email, например, этот метод также будет содержать их адрес электронной почты.

Лучший тест для аутентифицированного пользователя:

$code = $_REQUEST['code'] ? true : false;
if (!$code) {
    echo ("<script>window.top.location=\"...\"</script>");
}

проверит, авторизовал ли пользователь ваше приложение.

$access = $facebook->getAccessToken();

Убедитесь, что вы всегда запрашиваете токен доступа (приоритет!). Вы будете получать подписанный запрос только тогда, когда вы будете перенаправлены из диалога facebook в ваше приложение. (т. е.) диалог OAUT. Этот метод SDK также сохранит ваш токен доступа в переменную сеанса. Вы можете вызвать метод getAccessToken () на любой последующей странице приложения, на которой активен сеанс PHP, ДАЖЕ, КОГДА не было подписано ни одного запроса.

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

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

или, еще проще:

$user = $facebook->getUser();

Я склонен резервировать вызовы API для более сложных запросов, таких как публикация в фиде пользователей / фиде друзей.

Итак, резюмируем:

-> проверить на $code -> получить подписанный запрос на первой странице после диалога oAuth. -> Если cookie-файлы браузера отключены (вероятно, в ie), не забудьте перенести сеанс на следующую страницу с константой SID. Если вы этого не сделаете, вы потеряете свой сохраненный токен доступа (не очень хорошо!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...