OAuth от Facebook поражает меня ... снова. У нас довольно простая система:
- Пользователь использует OAuth для «получения» разрешений Facebook (базовая информация о пользователе + расширенное разрешение: запись на стене)
- Посредством настраиваемого redirect_uri пользователь перенаправляется обратно на нашу платформу, где пользовательская информация хранится в базе данных, и пользователь также помечается как «авторизованный», используя нашу собственную систему входа в систему.
Однако проблема в том, что иногда (я повторяю: иногда ...) пользователь не распознается через $ user = $ facebook-> getUser (); запрос. Только если установлен $ user, пользователь сохраняется в базе данных, так как мы знаем только, что пользователь аутентифицирован и может использовать $ facebook-> api ('/ me');
Странно то, что после первых испытаний пользователям выдается сообщение об ошибке, но если они снова нажимают «Войти через Facebook», все идет хорошо. И снова, не все пользователи испытывают эту проблему. У меня такое ощущение, что мой код еще не «распознает» пользователя, вошедшего в систему, при выполнении всех действий по созданию учетной записи.
Действительно надеюсь, что кто-нибудь может помочь, ниже я разместил код.
INITIATION:
$loginUrl = $facebook->getLoginUrl(array('scope' => 'friends_relationships,publish_stream,email,user_birthday,user_location,user_checkins,user_education_history,user_photos','redirect_uri' => 'REDIRECTED_PAGE.php'));
RETURN PAGE (REDIRECT_PAGE.PHP)
$fbuser = $facebook->getUser();
if ($fbuser) {
try {
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
error_log($e);
$fbuser = null;
}
}
$uid = $user_profile['id'];
// -> here's the problem: $fbuser is either 0 or not set
if (isset($fbuser) && $fbuser != '0')
{
$dbc = new DBC();
$dbc->connect(0, true);
$fbemailquery = $dbc->executeQuery("SELECT * FROM users WHERE fbuid = '".$uid."'");
if(!$dbc->isResultEmpty($fbemailquery)) {
// USER IS KNOWN, SO LOGIN
}
else {
// NEW USER
$firstname = $user_profile['first_name']; // etc etc
}
$dbc->close();
}