Вход в систему 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>
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. Если вы этого не сделаете, вы будете потеряйте сохраненный маркер доступа (нехорошо!).