我将尝试尽可能少地提炼正在发生的事情,但仍然会给你所有相关的代码。它不应该有所作为,但我正在使用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。
答案 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>