Я пытаюсь интегрировать Facebook в веб-приложение, над которым я работаю. Я получил ключ от апи и секретный ключ от Facebook, и установил URL-адрес сайта http://www.mysite.com/something/app/
Следующий код используется с http://www.mysite.com/something/app/signup/xxxx/ для определения того, подключен ли пользователь или нет:
$facebook = new Facebook(array( 'appId' => FB_APIKEY, 'secret' => FB_SECRETKEY, 'cookie' => true )); $session = $facebook->getUser(); if($session) { # Active session, let's try getting the user id (getUser()) and user info (api->('/me')) try{ $uid = $facebook->getUser(); $user = $facebook->api('/me'); } catch (Exception $e){} if(!empty($user)){ # User info ok? Let's print it (Here we will be adding the login and registering routines) echo $user; } else { # For testing purposes, if there was an error, let's kill the script die("There was an error."); } } else { # There's no active session, let's generate one $login_url = $facebook->getLoginUrl(); header("Location: ".$login_url); }
Но проблема в том, что когда пользователь перенаправляется на $ login_url, он продолжает перенаправлять назад, создавая бесконечный цикл.
URL-адрес перенаправления: https://www.facebook.com/connect/uiserver.php?app_id=xxxxxxxxxxx&method=permissions.request&display=page&next=http%3A%2F%2Fwww.something.com%2Fsomething%2Fapp%2Fsignup%2Fxxxxx % 2F & response_type = код & состояние = 6f51768c22974a16b5dcf4d8dc7f46df & fbconnect = 1
Я посмотрел другие подобные проблемы на SO, а также на Google и попробовал их решения, но это просто не помогло мне.
[ОБНОВИТЬ]
Хорошо, я думаю, что нахожусь на чем-то. Если я вхожу в систему как другой пользователь Facebook, я не перенаправляюсь в цикле. Кажется, это происходит только тогда, когда я использую свою собственную учетную запись Facebook, которая является администратором приложения. Но после перенаправления он должен возвращать getUser () правильно .. но это не по какой-то причине.
Есть идеи? Благодарю.
Я начал с нуля на новый .php-файл из корня моего сервера. Там все работает нормально, поэтому я узнал, что мой собственный код вызывает перенаправление веб-страницы.
На самом деле, это был mod_rewrite в моем файле .htaccess, который как бы перепутал вещи. Так или иначе, он не подбирает переменные GET, заданные FB. Поэтому мне нужно кое-что выяснить. Но по крайней мере теперь я знаю, что вызвало проблему. Дело закрыто!
У меня была эта проблема в некоторых браузерах и в итоге явилась причиной ошибок браузеров, заблокировав файл cookie, установленный сайтом, и, следовательно, сеанс.
Попробуйте добавить это на свою страницу:
header('P3P: CP="CAO PSA OUR"');
(Его PHP, вы также можете сделать это на метатеге через HTML)
Похоже, вы используете старую версию PHP SDK с кодом, предназначенным для работы с последней версией. Обновите PHP SDK до последней версии – v3.1.1
https://github.com/facebook/php-sdk
Тогда этот код должен работать.
Вы пробовали указать перенаправление uri:
<?php $loginUrl = $facebook->getLoginUrl( array( 'redirect_uri' => 'http://www.mysite.com/something/app/' ) ); ?>
Сценарий, стоящий за целевым URL, должен будет создать экземпляр объекта facebook для сеанса пользователей, который будет сохраняться.
У меня была такая же проблема. Когда я попытался использовать тот же самый код (последний FB SDK), который работает на другом сервере на текущем сервере, произошел бесконечный цикл перенаправления.
Когда я начал отлаживать его, я узнал, что причина в том, что текущий сервер $_REQUEST
, похоже, не обрабатывает значение в $_GET
. Таким образом, как $_GET['state']
и $_GET['code']
не читаются в $_REQUEST
. В base_facebook.php
кажется, что они используют $_REQUEST
вместо $_GET
чтобы получить значение кода и состояния.
Таким образом, легкое исправление для этого состоит в том, чтобы включить следующий код:
$_REQUEST['state'] = $_GET['state']; $_REQUEST['code'] = $_GET['code'];
Перед require_once
файла SDK в facebook.
Надеюсь, это поможет некоторым людям!
У меня такая же проблема. Вот простой код, он работает на одном сайте и так же просто, как может быть:
@ini_set('log_errors','On'); // enable or disable php error logging (use 'On' or 'Off') @ini_set('display_errors','On'); // enable or disable public display of errors (use 'On' or 'Off') include_once('lib/facebook.php'); // Create our application instance $config = array( 'appId' => 'xx', 'secret' => 'yyy' ); $link = 'http://someurl.com'; $facebook = new Facebook($config); // Get User ID $user = $facebook->getUser(); if($user){ ?> <p>logged in</p> <?php } else { $loginUrl = $facebook->getLoginUrl(array( 'scope' => 'manage_pages,email', 'redirect_uri' => $link, )); echo '<a href="'.$loginUrl.'">Login with FB</a>'; }
Итак, что делает id, он показывает ссылку на логин, когда пользователь не вошел в систему (или, если быть конкретным), если getUser () ничего не возвращает) и абзац с текстом, если getUser дает то, что он должен дать.
Простой тест покажет проблему. Доступ к нему по URL-адресу сайта, даже когда предоставляется разрешение пользователя, показывает URL-адрес для входа вместо абзаца.
В чем проблема? Пытаясь понять это, я добавил URL-адрес сайта как «Приложение на Facebook», поэтому его можно получить изнутри facebook. И эврика, если к ней обращаются таким образом (по URL страницы Canvas), getUser () работает правильно. Более того, когда вы посещаете страницу URL холста Canvas, тогда при непосредственном посещении сайта – getUser () также работает правильно.
Итак, где же улов? Пытаясь использовать функцию инкогнито браузера, я понял, что есть что-то, что хранится в браузере пользователя. Посещение сайта непосредственно из браузера, где пользователь уже был на странице Canvas Page url, показывает правильный ответ, тогда как в браузере, где пользователь havent посещает URL Canvas page, отображается URL-адрес входа.
Таким образом, это швы, что проблема каким-то образом связана с кешем браузера, и facebook не устанавливает ее правильно при посещении страницы, а не самой холст-страницы.
У кого-нибудь есть идея, как исправить эту проблему, работая только с php sdk?
Редактировать Также, когда предоставляется доступ к приложению, когда пользователь нажимает ссылку для входа, перенаправление возвращается на оригиналированную страницу с состоянием и кодом как параметры _GET.