Вход в систему Facebook Oauth 2.0 с использованием пакетов SDK PHP 3.1.1 и Javascript


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

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

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

Вот код:

<?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)).'</pre>';
  $user = null;
  }
}

?>
<!DOCTYPE html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
  <body>
    <?php if ($user_profile) { ?>
      Your user profile is 
      <pre>            
         <?php print htmlspecialchars(print_r($user_profile, true)) ?>
      </pre> 
    <?php } else { ?>
      <fb:login-button></fb:login-button>
    <?php } ?>
    <div id="fb-root"></div>
    <script>               
      window.fbAsyncInit = function() {
         FB.init({
           appId: '<?php echo $facebook->getAppID() ?>', 
           cookie: true, 
           xfbml: true,
           oauth: true
         });
        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-root').appendChild(e);
      }());
    </script>
  </body>
</html>
Author: HipN, 2011-10-24

1 answers

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

Несколько указателей с использованием PHP SDK:

$facebook->getUser(); 

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

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

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

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

$access = $facebook->getAccessToken();

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

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

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

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

$user = $facebook->getUser();

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

Итак, чтобы резюмировать:

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

 4
Author: David Barker, 2011-10-25 06:54:19