Почему PHP PHP SDK getUser всегда возвращает 0?
Я пытаюсь работать с веб-сайтом, который требует некоторой информации от пользователя Facebook, я использую PHP и JS SDK.
У меня есть функция в PHP:
public function isLoggedOnFacebook() {
$user = $this->_facebook->getUser();
if ($user) {
return $this->_facebook->api("/$user");
}
return false;
}
В классе, который держит объект facebook из SDK в $this->_facebook
.
Затем на блоке я делаю это:
<?php if (!$this->isLoggedOnFacebook()): ?>
<div>
<fb:login-button show-faces="true" perms="email" width="500" />
</div>
<?php endif ?>
И среда FB JS правильно настроена (я думаю), поэтому она работает. Таким образом, пользователь получает всплывающее окно и авторизует сайт.
Проблема даже после того, как приложение было разрешено пользователем. $user всегда 0, то есть $facebook->getUser()
всегда возвращает 0, а затем отображает лица пользователей, включая зарегистрированного пользователя, но если я позвоню ему, t24 > или что-то еще, тогда он выведет исключение недопустимого токена.
Я видел эту проблему, но я не видел решения, я понятия не имею
где проблема, и у меня заканчиваются идеи.
На вкладке "Разработчики" в разделе "Приложения" есть вкладка "Веб-сайт", где вы можете настроить URL-адрес своего сайта и домен вашего сайта, и я думаю, что это причина моей проблемы, но я не знаю именно эти поля должны содержать.
Ответы
Ответ 1
Ответ на мою конкретную проблему состоял в том, что были несовместимости между версиями JS SDK и PHP SDK, которые я использовал, и просто обновить их.
Симптом этой проблемы схож, когда это вызвано множеством разных вещей, поэтому вы можете очень хорошо разбираться в различных ответах, доступных на этой странице.
Ответ 2
У меня была та же проблема, и я понял, что это потому, что SDK использует переменную $_REQUEST
, а в моей среде не является истиной, которая объединяется с переменными $_GET
, $_POST
и $_COOKIE
.
Я думаю, что это зависит от версии PHP, и именно поэтому кто-то запустил ее, включив куки файлы.
Я нашел этот код в файле base_facebook.php:
protected function getCode() {
if (isset($_REQUEST['code'])) {
if ($this->state !== null &&
isset($_REQUEST['state']) &&
$this->state === $_REQUEST['state']) {
// CSRF state has done its job, so clear it
$this->state = null;
$this->clearPersistentData('state');
return $_REQUEST['code'];
} else {
self::errorLog('CSRF state token does not match one provided.');
return false;
}
}
return false;
}
И я изменил его, как показано ниже, создав переменную $server_info.
protected function getCode() {
$server_info = array_merge($_GET, $_POST, $_COOKIE);
if (isset($server_info['code'])) {
if ($this->state !== null &&
isset($server_info['state']) &&
$this->state === $server_info['state']) {
// CSRF state has done its job, so clear it
$this->state = null;
$this->clearPersistentData('state');
return $server_info['code'];
} else {
self::errorLog('CSRF state token does not match one provided.');
return false;
}
}
return false;
}
Ответ 3
У меня возникла аналогичная проблема. $facebook- > getUser() возвращал 0, а иногда возвращал действительный идентификатор пользователя, когда пользователь фактически не вошел в систему, что привело к ошибке Fatal Oauth, когда я пытался совершать вызовы графического api. Я, наконец, решил эту проблему. Я не знаю, правильно ли это, но это работает. Вот код:
<?php
include 'includes/php/facebook.php';
$app_id = "APP_ID";
$app_secret = "SECRET_KEY";
$facebook = new Facebook(array(
'appId' => $app_id,
'secret' => $app_secret,
'cookie' => true
));
$user = $facebook->getUser();
if ($user <> '0' && $user <> '') { /*if valid user id i.e. neither 0 nor blank nor null*/
try {
// Proceed knowing you have a logged in user who authenticated.
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) { /*sometimes it shows user id even if user in not logged in and it results in Oauth exception. In this case we will set it back to 0.*/
error_log($e);
$user = '0';
}
}
if ($user <> '0' && $user <> '') { /*So now we will have a valid user id with a valid oauth access token and so the code will work fine.*/
echo "UserId : " . $user;
$params = array( 'next' => 'http://www.anujkumar.com' );
echo "<p><a href='". $facebook->getLogoutUrl($params) . "'>Logout</a>";
$user_profile = $facebook->api('/me');
echo "<p>Name : " . $user_profile['name'];
echo "<p>";
print_r($user_profile);
} else {/*If user id isn't present just redirect it to login url*/
header("Location:{$facebook->getLoginUrl(array('req_perms' => 'email,offline_access'))}");
}
?>
Ответ 4
Посмотрите это сообщение в блоге: http://thinkdiff.net/facebook/new-javascript-sdk-oauth-2-0-based-fbconnect-tutorial/
Был выпущен новый JS SDK - https://developers.facebook.com/blog/post/525
Ответ 5
Вам нужно убедиться, что ваше приложение настроено на выбор параметра кода из строки запроса, а не uri_fragment, это можно установить на странице приложений facebook apps>settings>permissions
.
Это сделало для меня использование $facebook->getLoginUrl()
для предоставления URL-адреса для входа.
Ответ 6
Проверьте свой конфигурационный массив.
Убедитесь, что вы используете правильные строковые кавычки при настройке значений.
$config = array();
$config["appId"] = $APP_ID;
$config["secret"] = $APP_SECRET;
$config["fileUpload"] = false; // optional
Это работает.
$config = array();
$config[‘appId’] = 'YOUR_APP_ID';
$config[‘secret’] = 'YOUR_APP_SECRET';
$config[‘fileUpload’] = false; // optional
Это прямая копия/вставка с веб-сайта http://developers.facebook.com/docs/reference/php/ и НЕ работает из-за нечетных кавычек.
длинный ответ заключается в том, что ваш хэш для вашей "проверки" подписи приложения не подходит к правильной проверке, потому что секрет приложения не возвращает действительное значение (оно фактически ничего не возвращает)... поэтому Функция hash_hmac возвращает неверное значение, которое не соответствует должным образом и т.д.
Ответ 7
После отладки через base_facebook.php я нашел, потому что каким-то образом я потерял свой .crt файл, токен доступа навсегда недействителен. Убедитесь, что у вас есть файл fb_ca_chain_bundle.crt по адресу: https://github.com/facebook/facebook-php-sdk/blob/master/src/fb_ca_chain_bundle.crt
Ответ 8
Часы и часы вниз. Ни одно из сообщений об этом в Qaru или других сайтах не обеспечило решение моей проблемы. Я, наконец, вошел в библиотечный код и понял, где именно он умирает.
На моей машине разработки, которая использует XAMPP для Windows, я продолжал получать 0 для входа в систему, в то время как мой тестовый сервер работал бы правильно. После того, как исключение было брошено, но скрыто, я положил $e > getMessage() в base_facebook.php, в котором указывалось, что у меня ошибка SSL. Следующая публикация HTTPS и SSL3_GET_SERVER_CERTIFICATE: проверка сертификата не удалась, CA в порядке, привело меня к решению.
Решение:
В base_facebook.php добавьте следующее перед curl_exec ($ ch):
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
Вероятно, вы должны перенести это в любые флаги, которые вы используете, чтобы определить, находитесь ли вы в режиме разработки, потому что вам не нужна эта строка в производственной системе. Например:
if ( getenv( 'environment' ) === 'development' ) {
curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
}
Ответ 9
Я проверил и проверил долгое время. Теперь я нашел причину.
Войдите в приложения для разработчиков, в настройках → Advance → Миграции → Устаревший автономный доступ -. > отключен
Вы найдете $facebook- > getUser(), который будет работать.
другая вещь. лучше добавить домен, когда новый класс facebook;
$facebook = new Facebook(array(
'appId' => APP_ID,//$app_id,
'secret' => APP_SECRET,//$app_secret,
'cookie' => true,
'domain'=>'xxxdomain.com',
));
$session = $facebook->getUser();
Ответ 10
Попробуйте это в своем фрагменте кода:
если условие true, вы будете перенаправлены на facebook, а затем войдите в систему самостоятельно, и я надеюсь, что вам будет хорошо, но запомните использование новых библиотек php SDK
if(($facebook->getUser())==0)
{
header("Location:{$facebook->getLoginUrl(array('scope' => 'photo_upload,user_status,publish_stream,user_photos,manage_pages'))}");
exit;
}
else {
$accounts_list = $facebook->api('/me/accounts');
echo "i am connected";
}
Ответ 11
У меня была одна и та же проблема в приложении для Facebook, и я, наконец, понял это после 2-х дней расстройства волос. Это оказалось проблемой с перенаправлением-uri в getLoginUrl()
! если он не соответствует зарегистрированному домену приложения через facebook, они возвращают ошибку, и пользователь возвращается как 0 (значение по умолчанию для пользователя).
Ответ 12
Я решил это, поскольку столкнулся с одной и той же проблемой.
Просто перейдите к developers.facebook.com/apps, затем перейдите к своему приложению.
нажмите кнопку EDIT APP
ЕСЛИ у вас есть чек "Приложение на facebook" и ввели в него URL холста
приложение не будет работать на стороне facebook
будет работать под apps.facebook.com/
просто удалите эту проверку, это сработало для меня
Ответ 13
$facebook->getUser()
вернет 0, если пользователь не аутентифицирует приложение.
используйте $facebook->getLoginUrl
, чтобы получить URL-адрес для аутентификации приложения.
Ответ 14
<?php
require 'facebook.php';
// Create our application instance
// (replace this with your appId and secret).
$facebook = new Facebook(array(
'appId' => 'YOUR_APP_ID',
'secret' => 'YOUR_APP_SECRET',
));
// Get User ID
$user = $facebook->getUser();
// We may or may not have this data based
// on whether the user is logged in.
// If we have a $user id here, it means we know
// the user is logged into
// Facebook, but we don’t know if the access token is valid. An access
// token is invalid if the user logged out of Facebook.
if ($user) {
try {
// Proceed knowing you have a logged in user who authenticated.
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
error_log($e);
$user = null;
}
}
// Login or logout url will be needed depending on current user state.
if ($user) {
$logoutUrl = $facebook->getLogoutUrl();
} else {
$loginUrl = $facebook->getLoginUrl();
}
// This call will always work since we are fetching public data.
$naitik = $facebook->api('/naitik');
?>
<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
<head>
<title>php-sdk</title>
<style>
body {
font-family: 'Lucida Grande', Verdana, Arial, sans-serif;
}
h1 a {
text-decoration: none;
color: #3b5998;
}
h1 a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<h1>php-sdk</h1>
<?php if ($user): ?>
<a href="<?php echo $logoutUrl; ?>">Logout</a>
<?php else: ?>
<div>
Login using OAuth 2.0 handled by the PHP SDK:
<a href="<?php echo $loginUrl; ?>">Login with Facebook</a>
</div>
<?php endif ?>
<h3>PHP Session</h3>
<pre><?php print_r($_SESSION); ?></pre>
<?php if ($user): ?>
<h3>You</h3>
<img src="https://graph.facebook.com/<?php echo $user; ?>/picture">
<h3>Your User Object (/me)</h3>
<pre><?php print_r($user_profile); ?></pre>
<?php else: ?>
<strong><em>You are not Connected.</em></strong>
<?php endif ?>
<h3>Public profile of Naitik</h3>
<img src="https://graph.facebook.com/naitik/picture">
<?php echo $naitik['name']; ?>
</body>
</html>
Ответ 15
У меня была такая же проблема с getUser()
, она возвращает 0 в IE 8. Я нашел решение после выполнения некоторых исследований. Перейдите по ссылке ниже. Это работало как прелесть.
http://www.andugo.com/facebook-php-sdk-getuser-return-0-value-on-ie/
Ответ 16
После некоторых отчаянных часов вот что вызвало ту же проблему на моем сервере: если вы используете SSL, убедитесь, что порт 443 не заблокирован! Я открыл порт в прошлом году, но оказалось, что мой webhoster каким-то образом недавно сделал reset.
Ответ 17
Если вы используете новый SDK 3.1.1 и JS, вам нужно добавить новую переменную в подпрограмму FB.init под названием
oauth : true
использовать новый протокол OATH 2.0!
Затем обновите свою кнопку входа в систему, пока не разрешены perms, используйте область действия вместо perms
Ответ 18
getUser()
и PHP-SDK не работает, если _REQUEST
, как глобальные переменные, сбрасываемые http-сервером по неверной конфигурации. Я использовал неправильно настроенный nginx и после кода отслеживания ~ 3 часа решил эту проблему с помощью изменения конфигурации vhost.
Я написал комментарий о решении здесь: https://github.com/facebook/php-sdk/issues/418#issuecomment-2193699
Я надеюсь, что это поможет.
Ответ 19
A facebook- > getUser() вернет 0, когда пользователь не зарегистрирован. (Https://developers.facebook.com/docs/reference/php/facebook-getUser/)
Чтобы решить эту проблему, JS SDK для Facebook предоставляет токен доступа из успешного входа в систему, который вы можете использовать с помощью PHP PHP SDK.
Нижеприведенный javascript проверяет, существует ли учетная запись Facebook уже и разрешено ваше приложение Facebook:
FB.getLoginStatus(function($response) {
if ($response.status === 'connected') {
var uid = $response.authResponse.userID;
var accessToken = $response.authResponse.accessToken;
_accessServer(uid, accessToken);
} else if ($response.status === 'not_authorized') {
_loginPopup();
} else {
_loginPopup();
}
});
Функция _accessServer открывает еще один запрос на ваш сервер, отправляя токен доступа.
Функция _loginPopup должна открыть всплывающее окно входа в Facebook, запрашивающее соответствующие разрешения для пользователя, чтобы "разрешить доступ" к вашему приложению.
Приложение PHP затем должно передать токен доступа API Facebook:
$facebook->setAccessToken($new_access_token);
$uid = $facebook->getUser();
https://developers.facebook.com/docs/reference/php/facebook-setAccessToken/
Надеюсь, что это поможет.
Ответ 20
Добавление этой строки разрешило эту проблему для меня в IE9:
header('P3P:CP="IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT"'); // This is the main cause to use on IE.
Ответ 21
Если этот вопрос по-прежнему относится к людям, я хотел бы внести свой 2 цента, поскольку я изо всех сил пытался заставить все работать.
Прежде всего, попробуйте SDK, который вам подходит, будь то PHP или JS. По сути, они делают то же самое, просто JS может справиться с этим немного более элегантно (с всплывающим диалогом, а что нет). Там много разных руководств, руководств и примеров! Мне потребовалась неделя, чтобы найти 1, который мне подходит, и что я действительно мог бы использовать. После того, как вы найдете фрагмент кода, который работает с SDK, который вы планируете использовать, пришло время изменить код на ваши конкретные потребности.
Как только я закончил свой код, я начал его тестировать. Я заметил, что я запускаю свой код на localhost, и я тоже не получал результатов от своих массивов. Чтобы ответить на ваш вопрос: загрузите свой код в (под) домен и повторите попытку. Мой код работал все время, но поскольку у меня его не было в Интернете, он не работал. Если вы уже получили его в Интернете, то мой ответ вам не подходит.
Мне жаль, если эта маленькая история на самом деле не предназначена для того, чтобы быть в состоянии SO, но она может помочь людям.
Удачи!
Ответ 22
if ($facebook->getUser()) {
$userProfile = $facebook->api('/me');
// do logic
} else {
$loginUrl = $facebook->getLoginUrl($params = array('scope' => SCOPE));
header('Location:' . $loginUrl);
}
что я исправил свою проблему, теперь он возвращает мне деталь профиля пользователя для дальнейшей обработки. (это была такая головная боль)
Ответ 23
Это хорошие предложения, но то, что сработало для меня, - это на самом Facebook. После рефакторинга кода много раз я понял, что это проблема с конфигурациями на Facebook.
Следующие шаги решили мою проблему.
1.) В разделе "Основные" > "Приложение на Facebook"... я отменил выбор, хотя вы можете оставить его, если хотите
2.) В разделе "Разрешения" > "Конфиденциальность" → "Общедоступно"
Разрешения > Auth Token → set to Query String
3.) В разделе Дополнительно → Аутентификация > Тип приложения → Веб
Третий шаг - это тот, который действительно исправил все, не совсем уверен, почему, надеюсь, что помогает
Ответ 24
Убедитесь, что вы используете эту функцию Facebook API-функции getUser перед любым выходом, потому что она использует переменные сеанса и файлы cookie. Заголовки не могут быть отправлены/прочитаны правильно, если вы это сделали.
Ответ 25
Я также много часов смотрел на это, а также нашел решение. Возможно, не для вас, но кажется, что есть проблема с $_SERVER ['QUERY_STRING'], поэтому вам нужно установить его в массив $_REQUEST.
Я использовал codeigniter и обнаружил, что работает следующий код над загрузкой библиотеки.
parse_str ($ _ SERVER [ 'QUERY_STRING'], $_ REQUEST);
parse_str($_SERVER['QUERY_STRING'],$_REQUEST);
$config = array();
$config["appId"] = "63xxxxx39";
$config["secret"] = "dexxxx3bf";
$this->load->library('facebook',$config);
$this->user = $user = $this->facebook->getUser();
if ($user) {
try {
// Proceed knowing you have a logged in user who authenticated.
$user_profile = $this->facebook->api('/me');
//print_r($user_profile);exit;
} catch (FacebookApiException $e) {
echo '<pre>'.htmlspecialchars(print_r($e, true)).'</pre>';
$user = null;
}
$logout = $this->facebook->getLogoutUrl();
$this->fb_logout = $logout;
$this->fb_user = $user_profile;
} else {
$login = $this->facebook->getLoginUrl(array("scope"=>"email","redirect_uri"=>"http://domain/login/login_fbmember/"));
$this->fb_login = $login;
}
}
Ответ 26
Эта проблема действительно странная. Я обнаружил, что проблема была в статическом массиве $CURL_OPTS в base_facebook.php.
Попробуйте отредактировать это:
/**
* Default options for curl.
*
* @var array
*/
public static $CURL_OPTS = array(
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
CURLOPT_USERAGENT => 'facebook-php-3.2',
);
к
/**
* Default options for curl.
*
* @var array
*/
public static $CURL_OPTS = array(
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 60,
CURLOPT_USERAGENT => 'facebook-php-3.2',
CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4
);