Facebook API SDK (PHP) очистка сессий сайта - PullRequest
6 голосов
/ 14 апреля 2011

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

Поток:

  • Пользователь заходит на мой сайт (локальное имя пользователя и пароль)
  • Пользователь подключается к Facebook во всплывающем окне
  • Facebook аутентифицирует пользователя и возвращает его на мой сайт
  • Сессия моих сайтов теперь недействительна (как во всплывающем окне, так и в главном окне), в результате чего пользователь выходит из системы

Я использую Facebook SDK (PHP), а мой сайт использует платформу CakePHP

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

2 голосов
/ 14 апреля 2011

Я не могу сказать вам, что удаляет ваш сеанс, но вы можете попробовать это (работает для меня)

используйте Javascript SDK для отображения кнопок входа в систему, которые откроют всплывающее окно для подключения к FB

добавьте js SDK на свою страницу следующим образом:

<div id="fb-root"></div>
<script>
  window.fbAsyncInit = function() {
    FB.init({appId: '<?php echo FB_API_ID; ?>', status: true, cookie: true, xfbml: true});
    FB.Event.subscribe('auth.login', function() {
        new Request({
            'method': 'get',
            'url': '<?php echo $this->Html->url(array('controller'=>'users','action'=>'login_fb'));?>',
            'onSuccess': function(result){
                window.location.reload();       
            }
        }).send();
  });
  };
  (function() {
    var e = document.createElement('script'); e.async = true;
    e.src = document.location.protocol +
      '//connect.facebook.net/en_US/all.js';
    document.getElementById('fb-root').appendChild(e);
  }());
</script>

В случае auth.login я использую ajax-вызов к / users / login_fb, который будет использовать Facebook SDK для проверки сеанса facebook:

    App::import('Lib', 'facebook_sdk/facebook');
    // "MyAuth" is a custom Auth Component that extends the normal Auth component
    $this->MyAuth->facebook = new Facebook(array(
      'appId'  => FB_API_ID,
      'secret' => FB_SECRET,
      'cookie' => true,
    ));

    $me = null;
    $session = $this->MyAuth->facebook->getSession();
    if ($session) {
      try {
        $uid = $this->MyAuth->facebook->getUser();
        $me = $this->MyAuth->facebook->api('/me');
      } catch (FacebookApiException $e) {
        error_log($e);
      }
    }

    if ($me) {
        $this->Session->write('FbLogin.session',$session);
        $this->Session->write('FbLogin.user',$me);
        $UserModel = ClassRegistry::init('User');
        $user = $UserModel->findByUid($me['id']);
        if(!$user){
            $UserModel->create();
            $user_data = array( 'username'=>$me['username'],
                        'name'=>$me['first_name'],
                        'lastname'=>$me['last_name'],
                        'email'=>$me['email'],
                        'group_id'=>GROUP_VISITOR,
                        'uid'=>$me['id']
                        );
            $UserModel->save($user_data);
            $user['User']['id'] = $UserModel->id;
        } 
        $this->Session->write($this->MyAuth->sessionKey, $user['User']);
        $this->MyAuth->_loggedIn = true;
        }
}

основная идея заключается в том, что .. в js я вызываю ajax для проверки сеанса fb, а затем сохраняю его в сеансе cake, и js обновляет страницу

1 голос
/ 14 апреля 2011

Я не смог выяснить, почему сеанс сбрасывался, поэтому решил не использовать SDK для аутентификации.Это то, что я использовал вместо.

$code = (isset ($_REQUEST['code']) ? $_REQUEST['code'] : null);

if (empty ($code)) {
    $dialogUrl = 'http://www.facebook.com/dialog/oauth?client_id=' . $this->appId . '&redirect_uri=' . urlencode($this->url) . '&scope=' . implode(',', $this->scope);
    header('Location: ' . $dialogUrl);
    die;
}
else {
    $tokenUrl = 'https://graph.facebook.com/oauth/access_token?client_id=' . $this->appId . '&redirect_uri=' . urlencode($this->url) . '&client_secret=' . $this->secret . '&code=' . $code;
    $accessToken = file_get_contents($tokenUrl);

    $this->Session->write('facebookAccessToken', $accessToken);

    $graphUrl = 'https://graph.facebook.com/me?' . $accessToken;
    $fbUser = json_decode(file_get_contents($graphUrl));

    if ($fbUser) {
        ...
    }
}
1 голос
/ 14 апреля 2011

Может быть стоит проверить уровень безопасности Cake, это может быть проверка реферера (я думаю, что он делает это в настройках «high», может быть, и «medium»), что приведет к аннулированию сессии.

...