Facebook PHP SDK getSession () не может получить сессию.Проблема с печеньем? - PullRequest
3 голосов
/ 08 июня 2011

Справочная информация:

  • Использование Facebook PHP SDK v 2.1.2
  • cookieSupport = true
  • Приложение на Facebook включает OAuth 2.0 для Canvas
  • Логика Facebook Connect / входа в систему происходит через https на отдельном поддомене (secure.mysite.com)
  • Сайтами разработчиков являются dev.mysite.com:PORT_NUM

Что работает

  • Я могу успешно войти через Facebook Connect
  • После авторизации через диалоговое окно Facebook, мы регистрируем пользователя и затем перенаправляем на fbconnect.php, который создает экземпляр класса Facebook и вызывает $ facebook-> getSession ()
  • Возвращает действительный сеанс Facebook, и мы продолжаем нашу логику после входа в систему
  • Затем мы перенаправляем на авторизованную домашнюю страницу

Что не работает

  • В любое время после этого $ facebook-> getSession () возвращает NULL. Неважно, что.
  • Согласно документам, Facebook должен создавать действительный сеанс на основе файла cookie, если он действителен. Длительность по умолчанию установлена ​​равной 1 часу, но вызовы, совершаемые даже через 30 секунд после установки cookie, завершаются неудачей.

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

Есть много людей, имеющих схожие проблемы с сеансами Facebook из того, что я видел, но предложения, с которыми я сталкивался, не касаются содержимого файлов cookie fbs_, доменов, портов и т. Д. Мое понимание то, как такие вещи относятся к файлам cookie, относительно невелико, но я хотел бы, по крайней мере, отметить их как не связанные с этим проблемы, чтобы я мог посмотреть в другом месте.

Цените любые идеи.

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

У меня была похожая проблема с вами, и я начал использовать что-то похожее на следующее:

function get_facebook_cookie($app_id, $app_secret) {
 $args = array();
 parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args);
 ksort($args);
 $payload = '';
 foreach ($args as $key => $value) {
 if ($key != 'sig') {
  $payload .= $key . '=' . $value;
 }
 }
 if (md5($payload . $app_secret) != $args['sig']) {
return null;
}
return $args;
 }
 $cookie = get_facebook_cookie(APP_ID, APP_SECRET);
 $me = json_decode(file_get_contents('https://graph.facebook.com/me?access_token='.$cookie['access_token']));

if ($me) {
echo "Hi ".$me->name;

} else { ?>
<a href="https://www.facebook.com/dialog/oauth?client_id=<?= APP_ID;?>&redirect_uri=<?= REDIRECT_URI ;?>"><img src="http://static.ak.fbcdn.net/rsrc.php/zB6N8/hash/4li2k73z.gif"><!--Login with Facebook--></a>

Я также включаю следующие JS

 <div id="fb-root"></div>
<script src="http://connect.facebook.net/en_US/all.js"></script>
<script>
  FB.init({appId: '<? echo APP_ID ?>', status: true,
           cookie: true, xfbml: true});
  FB.Event.subscribe('auth.login', function(response) {
    window.location.reload();
  });
</script>

Я использовал PHP SDK, такой как вы, но я перестал делать то, что он не работает.Я заметил, что это все еще вызывает несколько ошибок в журналах ошибок, относящихся к cookie-файлам, поэтому кажется, что он в первую очередь полагается на JS, чтобы инициализировать cookie-файл.Версия 3 SDK доступна сейчас, так что, возможно, это поможет.Единственная разница между этим заключается в том, что я должен вручную вызывать file_get_contents для объекта графа, который я хочу, но достаточно просто написать функцию или класс, чтобы сделать это для вас

0 голосов
/ 29 января 2012

Эта проблема исчезла с новым Facebook PHP SDK (v3)

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