Аутентификация Facebook в функции - getUser () возвращает 0 - PullRequest
5 голосов
/ 10 сентября 2011

Я пытаюсь настроить функцию в моем контроллере для публикации альбома в Facebook. Каждый раз, когда к функции обращаются, меня перенаправляют на REDIRECT_URI, как будто $ userid = 0, даже если я только что правильно вошел в Facebook. Это потому, что после входа в систему он перезапускает функцию и создает новый сеанс Facebook, уничтожая пользователя, которого я только что получил?

Спасибо за любую помощь, которую вы можете предоставить.

 function share($id){
            if (!$id) { $this->Session->setFlash(__('Invalid id for Album', true)); 
            $this->redirect(array('action'=>'index')); }  
            $photos = $this->Album->find('all', array('conditions' => array('Album.id' => $id))); 


            $facebook = new Facebook(array('appId'=>'valid aphid', 'secret'=>'valid secret')); 
            $facebook->setFileUploadSupport(true);
            $userid = $facebook->getUser(); 

            if($userid) {               
                try {
                      $user_profile = $facebook->api('/me'); // Gets User's information based on permissions the user has granted to your application.

                } 
                catch(FacebookApiException $e){
                    error_log($e);
                    // Print results if you want to debug.
                    $userid = null;
                }

            } else {

                $login_url = $facebook->getLoginUrl($params = array('redirect_uri' => REDIRECT_URI,'scope' => PERMISSIONS_REQUIRED));
                echo ("<script> top.location.href='".$login_url."'</script>");
            }

            //Create album
            $results = $facebook->api('me/albums', 'post', $photos[0]['Album']['name']);//->photos_createAlbum($albumname, '', '', 'everyone', $this->_userid); 

        }

Ответы [ 5 ]

4 голосов
/ 10 сентября 2011

По умолчанию класс Facebook использует сеансы PHP для хранения состояния аутентификации пользователя. Можно использовать четыре переменные сеанса:

  • fb_{appid}_user_id: идентификатор пользователя Facebook
  • fb_{appid}_code: код авторизации, который необходимо обменять на токен доступа
  • fb_{appid}_access_token: токен доступа, который можно использовать для вызовов API
  • fb_{appid}_state: токен CSRF

Убедитесь, что ваши сеансы PHP настроены и работают правильно.

  • По умолчанию имя файла cookie - PHPSESSID; вы должны увидеть это в вашем браузере.
  • Если вы распределяете нагрузку между несколькими серверами, вам понадобится решение, которое позволит вам совместно использовать состояние сеанса на этих серверах.
  • Невозможно вывести текст перед началом сеанса (выполняется автоматически, если необходимо при создании экземпляра объекта Facebook). Возможно, вы захотите добавить это в качестве первой строки вашей функции:

    if (!session_id()) { session_start(); }
    
2 голосов
/ 08 мая 2012

У меня была точно такая же проблема в моем приложении на Facebook, и я наконец-то понял это после 2 дней разочарования.Это оказалось проблемой с редиректом-uri в getLoginUrl ()!если он не соответствует зарегистрированному домену приложения через Facebook, они возвращают ошибку, и пользователь возвращается как 0 (значение пользователя по умолчанию)

1 голос
/ 12 марта 2013

Может быть немного поздно, но у меня была такая же проблема.

моей ошибкой был URL-адрес обратного вызова, в котором отсутствовало имя файла php: index.php, который я дал только после http://www.xxxxx.xxx/я изменил его на http://www.xxxxx.xxx/index.php это сработало.

0 голосов
/ 07 декабря 2012

Я не могу действительно объяснить, почему это работает, но когда у меня возникали проблемы с getUser (), всегда возвращающим 0, я включил Javascript SDK на мою страницу.Тогда это просто сработало.Может быть, вы можете попробовать, если это также решит вашу проблему

0 голосов
/ 06 декабря 2012

Я понял, что redirect-uri должен создать экземпляр класса Facebook и вызвать getUser (), поскольку происходит некоторое волшебство с возвращенным «кодом» из Facebook (как указывает PCheese).

Так что, чтобы уточнить, перенаправление на loggedin.html бесполезно, вам нужно перенаправить на loggedin.php и вызвать

$facebook = new Facebook(array(
  'appId'  => 'yourAppID',
  'secret' => 'yourSecret',
));

$user = $facebook->getUser();

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

Также здесь есть страница в Facebook, объясняющая весь процесс и как обменять «код» на токен доступа, если вы не используете их класс php, http://developers.facebook.com/docs/howtos/login/server-side-login/ (Шаг 6)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...