Facebook OpenGraph с Yii Framework — проблема аутентификации

У меня проблема с php Facebook SDK. Я читал много сообщений, в которых говорилось об одних и тех же проблемах (неверный токен доступа, цикл перенаправления и т. д.), но никто не мог помочь.

Кратко о том, как устроен мой проект:

Это приложение Facebook, предназначенное для работы только с пользователем, вошедшим в Facebook. Используя Yii Framework, я создал фильтр, который вызывается каждый раз при загрузке страницы, чтобы убедиться, что контент виден только пользователям Facebook, вошедшим в систему. Оно должно вести себя точно так же, как приложение BranchOut на Facebook.

Моя проблема и как ее воспроизвести:

  • Я вхожу в свое приложение, используя типичный процесс входа из Facebook (OAuth, токен доступа)
  • Я выхожу вручную на странице Facebook, а затем пытаюсь выполнить новое действие в своем приложении.
  • Фильтр проверяет, зарегистрирован ли я на Facebook, и поскольку это не так, он перенаправляет меня на страницу входа в Facebook.
  • После того, как я снова вхожу в Facebook, я получаю типичный бесконечный цикл между Facebook и фильтром моего приложения.

Вот код моего фильтра:

$fb_logged = false;
try
{
    $user = Yii::app()->facebook->getUser();
    $me = Yii::app()->facebook->api('/me');
    $fb_id = $me['id'];
    $fb_logged = true;
}
catch (Exception $e)
{
    $fb_logged = false;
}

if($fb_logged)
{
    print_r($fb_id. ' has logged');
    /* Check if user exists on MyApp 
     ... */
}
// If user NOT logged on FB, send him to the FB login page
else
{
    $loginUrl = Yii::app()->facebook->getLoginUrl(array(
                'redirect_uri' => Yii::app()->getRequest()->getUrl() // I have tried many things here.
        ));
    echo("<script> top.location.href='" . $loginUrl . "'</script>");
    Yii::app()->end();
}

Что именно происходит, так это то, что после входа в FB фильтр вызывается снова, потому что делается запрос на тот же URL. И в этот момент вызов api('/me') генерирует исключение, потому что он не может найти действительный токен доступа и начинает зацикливаться на нем.

Я могу добавить, что моя конфигурация хороша (или кажется), я проверил все свои URL-адреса, доменное имя в соответствии с настройками приложения Facebook. Я также пробовал много вещей, таких как перенаправление на новый конкретный URL-адрес, но в любом случае мне также нужно использовать фильтр, потому что я хочу убедиться, что это все тот же пользователь (или действовать соответственно, если пользователь изменился).

Единственное, что работает, это перенаправить пользователя на страницу без фильтра (вызов api("/me") не выполняется). А потом, кликнув рукой по новой ссылке в приложении, а там токен доступа находится. И это не то поведение, которое я хочу.

Я очень надеюсь, что кто-то может мне помочь!

Заранее спасибо.


person ant1g    schedule 07.06.2012    source источник
comment
Вы нашли, в чем проблема до сих пор. Я испытываю ту же проблему   -  person Keeper Hood    schedule 26.04.2013


Ответы (2)


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

person CBroe    schedule 07.06.2012
comment
Знаете ли вы, как это сделать с помощью SDK? Обычно метод getUser() должен делать все это, но никоим образом с помощью getUser() я получаю идентификатор FB, даже если я вышел из системы... Я также пытался очистить сеанс/куки, чтобы сделать вызов getUser(), чтобы убедиться, что новый access_token будет запрошен, но ни в коем случае! Вызов api('/me') сразу после этого все еще говорит мне, что активного токена нет. - person ant1g; 07.06.2012

Взгляните также на расширение yiiauth. Он был опубликован только сегодня, и с его помощью вы можете войти в систему с помощью 29 различных провайдеров: Facebook, OpenID, Google, Twitter, Yahoo и т. д.

Он использует библиотеку HybridAuth, и AFAICT делает аутентификацию очень простой.

person adamors    schedule 11.06.2012
comment
Спасибо Орс. То, что я хочу сделать, это неявная аутентификация. Я не хочу, чтобы люди нажимали кнопку входа или что-то в этом роде. Я просто хочу, чтобы они автоматически регистрировались в моем приложении, если они вошли в FB. Я не думаю, что это возможно с yiiauth. - person ant1g; 13.06.2012