Я пытаюсь работать с веб-сайтом, который требует некоторой информации от пользователя 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, а затем перечисляет лица пользователей, включая зарегистрированного пользователя, но если я позвоню $facebook->api('/me')
или что-то еще, тогда он выкинет недопустимое исключение токена.
Я видел эту проблему, но я не видел решения, я понятия не имею, где проблема, и у меня заканчиваются идеи.
На странице разработчиков в разделе «Приложения» есть вкладка «Веб-сайт», где вы можете настроить URL-адрес своего сайта и домен вашего сайта, и я думаю, что это причина моей проблемы, но я не знаю, что именно поля должны содержать.
У меня была та же проблема, и я понял, что это потому, что 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; }
Я столкнулся с подобной проблемой. $ 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 ie neither 0 nor blank nor null*/ try { // Proceed knowing you have a logged in user who's 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'))}"); } ?>
Отметьте это сообщение в блоге: http://thinkdiff.net/facebook/new-javascript-sdk-oauth-2-0-based-fbconnect-tutorial/
Был выпущен новый JS SDK – https://developers.facebook.com/blog/post/525
Вам нужно убедиться, что ваше приложение настроено на выбор параметра кода из строки запроса, а не uri_fragment, это можно установить на приложениях apps>settings>permissions
facebook apps>settings>permissions
.
Для этого я использовал $facebook->getLoginUrl()
чтобы $facebook->getLoginUrl()
URL-адрес входа.
Проверьте свой конфигурационный массив. Убедитесь, что вы используете правильные строковые кавычки при настройке значений.
$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 возврат неправильного значения, которое не соответствует должным образом и т. д. …
После отладки через base_facebook.php я нашел, потому что каким-то образом я потерял свой .crt-файл, токен доступа навсегда недействителен. Убедитесь, что у вас есть файл fb_ca_chain_bundle.crt по адресу: https://github.com/facebook/facebook-php-sdk/blob/master/src/fb_ca_chain_bundle.crt
Часы и часы вниз. Ни одно из сообщений об этом в Stack Overflow или других сайтах не обеспечило решение моей проблемы. Наконец я вошел в библиотечный код и понял, где именно он умирает.
На моей машине разработки, которая использует 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 ); }
Я проверил и испытал долгое время. Теперь я нашел причину.
Войдите в приложения разработчика, в настройках -> Advance -> Migrations -> Устаревший автономный доступ -> отключен .
Вы найдете $ 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();
Попробуйте это в своем фрагменте кода: если условие 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"; }
Я решил это, поскольку столкнулся с одной и той же проблемой. Просто перейдите к developers.facebook.com/apps, затем перейдите к вашему приложению. Нажмите кнопку EDIT APP.
Если у вас есть чек «Приложение на facebook» и ввели URL-адрес холста, приложение не будет работать, а facebook будет работать под apps.facebook.com/
просто удалите эту проверку, это сработало для меня
<?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's 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>
$facebook->getUser()
вернет 0, если пользователь не аутентифицирует приложение.
используйте $facebook->getLoginUrl
чтобы получить URL-адрес для аутентификации приложения.
У меня была такая же проблема в моем приложении для Facebook, и я, наконец, понял это после 2-х дней, когда волосы расстраивались. Это оказалось проблемой с перенаправлением-uri в getLoginUrl()
! если он не соответствует зарегистрированному домену приложения через facebook, они возвращают ошибку, и пользователь возвращается как 0 (значение по умолчанию пользователя).
У меня была getUser()
же проблема с getUser()
, она возвращает 0 в IE 8. Я нашел решение после ряда исследований. Перейдите по ссылке ниже. Это работало как прелесть.
http://www.andugo.com/facebook-php-sdk-getuser-return-0-value-on-ie/
После некоторых отчаянных часов вот что вызвало ту же проблему на моем сервере: если вы используете SSL, убедитесь, что порт 443 не заблокирован ! Я открыл порт в прошлом году, но оказалось, что мой webhoster как-то сделал сброс в последнее время.
Если вы используете новый SDK 3.1.1 и JS, вам нужно добавить новую переменную в подпрограмму FB.init
oauth : true
для использования нового протокола OATH 2.0! Затем обновите свою кнопку входа в систему, пока не разрешены прокрутки, используйте область вместо perms
getUser()
и PHP-SDK бесшумно терпят неудачу, если _REQUEST
например, глобальные переменные, удаленные HTTP-сервером по неверной конфигурации. Я использовал неправильно настроенный nginx и после кода отслеживания ~ 3 часа решил эту проблему с помощью изменения конфигурации vhost.
Я написал комментарий о решении здесь: https://github.com/facebook/php-sdk/issues/418#issuecomment-2193699
Я надеюсь, что это поможет.
Функция facebook-> getUser () вернет 0, если пользователь не зарегистрирован. (https://developers.facebook.com/docs/reference/php/facebook-getUser/)
Чтобы решить эту проблему, SDK Facebook JS предоставляет токен доступа из успешного входа в систему, который вы можете использовать с помощью 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/
Надеюсь, это поможет.
Добавление этой строки разрешило эту проблему для меня в 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.
Если этот вопрос по-прежнему относится к людям, я хотел бы внести свой 2 цента, поскольку я изо всех сил пытался заставить все работать.
Прежде всего, попробуйте SDK, который подойдет вам, будь то PHP или JS. По сути, они делают то же самое, просто JS может справиться с этим немного более элегантно (с всплывающим диалоговым окном, а что нет). Там много разных руководств, руководств и примеров! Мне потребовалась неделя, чтобы найти 1, который мне подходит, и что я действительно мог бы использовать. Когда вы найдете фрагмент кода, который работает с SDK, который вы планируете использовать, пришло время изменить код на ваши конкретные потребности.
Как только я закончил свой код, я начал его тестировать. Я заметил, что я запускаю свой код на localhost, и я тоже не получал результатов от своих массивов. Чтобы ответить на ваш вопрос: загрузите свой код в (дополнительный) домен и повторите попытку. Мой код работал все время, но поскольку у меня его не было в Интернете, это не сработало. Если вы уже получили его в Интернете, то мой ответ вам не подходит.
Прошу прощения, если эта маленькая история на самом деле не предназначена для того, чтобы быть ТАК, но это может помочь людям.
Удачи!
if ($facebook->getUser()) { $userProfile = $facebook->api('/me'); // do logic } else { $loginUrl = $facebook->getLoginUrl($params = array('scope' => SCOPE)); header('Location:' . $loginUrl); }
что как я исправил свою проблему, теперь он возвращает мне деталь профиля пользователя для дальнейшей обработки. (это была такая головная боль)
Это хорошие предложения, но то, что сработало для меня, – это на самом Facebook. После рефакторинга кода много раз я понял, что это проблема с конфигурациями на Facebook.
Следующие шаги решили мою проблему.
1.) В разделе «Основные»> «Приложение на Facebook» … я не выбрал, что, хотя вы можете оставить его, если хотите
2.) В разделе «Разрешения»> «Конфиденциальность» -> «Установить в общедоступную»
Разрешения> Auth Token -> set to Query String
3.) В разделе Дополнительно -> Аутентификация> Тип приложения -> Веб
Третий шаг – это тот, который действительно исправил все, не совсем уверен, почему, хотя, надеюсь, что это поможет
Убедитесь, что вы вызываете эту функцию API-функции Facebook API перед любым выходом, потому что она использует переменные сеанса и файлы cookie. Если вы сделали, заголовки не могут быть отправлены / прочитаны правильно.
Я также много часов смотрел на это, а также нашел решение. Возможно, не для вас, но кажется, что есть проблема с $ _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's 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; } }
Эта проблема действительно странная. Я обнаружил, что проблема была в статическом массиве $ 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 );
Ответ на мою конкретную проблему состоял в том, что были несовместимости между версиями JS SDK и PHP SDK, которые я использовал, и просто их модернизировать.
Симптом этой проблемы схож, когда он вызван множеством разных вещей, поэтому вы можете очень хорошо разбираться в различных ответах, доступных на этой странице.