使用Facebook Connect和官方PHP API注销用户失败

时间:2010-03-03 06:38:06

标签: php zend-framework facebook

我将尝试尽可能少地提炼正在发生的事情,但仍然会给你所有相关的代码。它不应该有所作为,但我正在使用Zend Framework。如果用户未登录,则执行此代码,它将在PreDispatch控制器插件中触发:

Zend_Loader::loadClass('Users');
$users = new Users(Zend_Registry::get('dbAdapter'));
if($users->is_facebook_user())
{
    $result = $users->login_facebook_user();

    if($result == 'success')
        $role = $users->role_id;
}

现在只有在他们没有登录时才调用上面的代码。这样做是为了检查并查看他们是否登录到Facebook。

这是is_facebook_user()方法:

public function is_facebook_user()
{
    $this->fb_userid = $this->fb->get_loggedin_user();

    if($this->fb_userid != '')
    {
        $this->load_user_by_facebook_id($this->fb_userid);
        return true;
    }
    else
        return false;
}

$fb变量是我从Facebook下载的官方Facebook PHP API类。该方法基本上返回Facebook用户ID。然后它调用一个从数据库中提取用户信息的方法。如果你回头看第一段代码,你可以看到我然后调用一个方法来记录该用户。

现在,如果我使用fiddler观看流量,我会看到以下一系列事件: 1.调用注销网址,调用Zend_Auth::getInstance()->clearIdentity(); 2.然后调用Facebook Logout方法,该方法基本上重定向到那里的网站并将用户注销。 3.然后重定向回到传递给Facebook注销方法的返回URL 4.然后我再看到它再次调用get_loggedin_user,因为当它回到我的站点时会被注销。

这是问题所在。我可以看到get_loggedin_user返回一个未登录的用户,这是此方法的结果

$this->fb_userid = $this->fb->get_loggedin_user();

但我确实得到了一个用户ID。那么我的代码怎么能得到这个ID,即使我在调用它之前将它设置为null,所以它仍然没有办法在代码中,但是以某种方式观察流量我可以看到它为用户返回null id,但我以某种方式获得了用户ID。

1 个答案:

答案 0 :(得分:0)

<?php

define('YOUR_APP_ID', '219415891407832');
define('YOUR_APP_SECRET', '44b22aeb3404ff5918cb58333532d22b');


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(YOUR_APP_ID, YOUR_APP_SECRET);
echo "<pre/>";
/*print_r($_COOKIE);

print_r($cookie);*/
$user = json_decode(file_get_contents('https://graph.facebook.com/me?access_token=' . $cookie['access_token']));

$photo = json_decode(file_get_contents('https://graph.facebook.com/100000439661780/albums?access_token=' . $cookie['access_token']));

echo "<pre/>";
print_r($photo);
?>
<img src="https://graph.facebook.com/ureshpatel5/picture" height="200" width="200" />
<html>
  <body>
  <?php
  $albums = $facebook->api('/me/albums');
print_r($albums);
foreach($albums['data'] as $album)
{
        // get all photos for album
        $photos = $facebook->api("/{189346844423303_46487}/photos");

        foreach($photos['data'] as $photo)
        {
                echo "<img src='{$photo['source']}' />", "<br />";
        }
}  
  ?>
    <?php if ($cookie) { ?>
      Welcome <?= $user->name ?>
    <?php } else { ?>
      <fb:login-button></fb:login-button>
    <?php } ?>

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

      });
          </script>
  </body>
</html>