PHP-SDK Facebook авторизация продолжает перенаправлять - PullRequest
2 голосов
/ 21 августа 2011

Я пытаюсь интегрировать Facebook в веб-приложение, над которым я работаю.Я получил ключ API и секретный ключ от 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=code&state=6f51768c22974a16b5dcf4d8dc7f46df&fbconnect=1

Я рассмотрел другие подобные проблемы в SO, а также в Google и попробовал их решения, но они просто не помогли мне.

[ОБНОВЛЕНИЕ]

Хорошо, я думаю, что я на что-то.Если я войду в систему как другой пользователь Facebook, меня не будут перенаправлять в цикле.Кажется, это происходит только тогда, когда я использую свою учетную запись Facebook, которая является администратором приложения.Но после перенаправления он должен вернуть getUser () правильно ... но по какой-то причине это не так.

Есть идеи?Спасибо.

Ответы [ 5 ]

3 голосов
/ 22 августа 2011

Я начал с нуля новый файл .php из корня моего сервера.Там все работало нормально, поэтому я обнаружил, что мой собственный код вызывает перенаправление веб-страницы.

На самом деле, это был mod_rewrite в моем файле .htaccess, который все испортил.Каким-то образом это не захватывает переменные GET, установленные FB.Поэтому мне нужно кое-что придумать.Но, по крайней мере, теперь я знаю, что вызвало проблему.Дело закрыто!

1 голос
/ 03 октября 2012

У меня тут такая же проблема.Вот простой код, он запускается на одном сайте и настолько прост, насколько может быть:

@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>'; 
}

Так, что делает идентификатор, он показывает ссылку для входа в систему, когда пользователь не вошел в систему (или будетконкретный - если getUser () ничего не получает), и параграф с текстом, если getUser дает то, что он должен дать.

Простой тест покажет проблему.При доступе к нему по URL-адресу сайта, даже когда пользователь получает разрешение, вместо абзаца отображается URL-адрес входа.

В чем проблема?Пытаясь выяснить это, я добавил URL-адрес сайта как «Приложение на Facebook», чтобы к нему можно было получить доступ изнутри Facebook.И eureka, если к нему обращаются таким образом (по URL-адресу Canvas Page), getUser () работает правильно.Более того, когда вы заходите по URL-ссылке на страницу холста, то при прямом посещении сайта getUser () также работает правильно.

Так в чем же подвох?Пытаясь с помощью функции инкогнито браузера, я понял, что в браузере пользователя что-то есть.Посещение сайта непосредственно из браузера, где пользователь уже был на URL-адресе страницы холста, показывает правильный ответ, тогда как в браузере, где пользователь не посетил URL-адрес страницы холста, отображается URL-адрес входа.

Итак, проблема в том, что проблема каким-то образом связана с кешем браузера, и Facebook не устанавливает правильный путь при посещении всей страницы вместо самой страницы холста.

У кого-нибудь есть идеи, как исправитьэта проблема работает только с php sdk?

Редактировать Кроме того, когда предоставляется доступ к приложению, когда пользователь нажимает на ссылку для входа, редирект возвращается на исходную страницу с состоянием и кодом в качестве параметров _GET.

1 голос
/ 16 апреля 2012

У меня только что была такая же проблема.Когда я попытался использовать тот же код (последний FB SDK), который работает на другом сервере на текущем сервере, произошел бесконечный цикл перенаправления.

Когда я начал отлаживать его, я обнаружил, что причинапотому что текущий сервер $_REQUEST не обрабатывает значение в $_GET.Таким образом, и $_GET['state'], и $_GET['code'] не читаются в $_REQUESTbase_facebook.php кажется, что они используют $_REQUEST вместо $_GET для получения кода и значения состояния.

Таким образом, легко исправить это, включив следующий код:

$_REQUEST['state'] = $_GET['state'];
$_REQUEST['code'] = $_GET['code'];

До require_once файла Facebook SDK.

Надеюсь, это поможет некоторым людям!

1 голос
/ 21 августа 2011

У меня возникла эта проблема в некоторых браузерах, и в итоге я столкнулся с ошибкой браузера, заблокировав cookie, установленный сайтом, и, следовательно, сеанс.

Попробуйте добавить это на свою страницу:

header('P3P: CP="CAO PSA OUR"');

(его PHP, вы также можете сделать это на метатег через HTML)

1 голос
/ 21 августа 2011

Похоже, вы используете старую версию 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, чтобы сеанс пользователей сохранялся.

...