我正在尝试在我的控制器中创建一个功能,将专辑发布到Facebook。每次访问该函数时,我都被重定向到REDIRECT_URI,就像$ userid = 0一样,即使我刚刚正确登录Facebook。这是因为登录后,它会重新启动该功能并创建一个新的Facebook会话,消灭我刚刚获得的用户?
感谢您提供的任何帮助。
function share($id){
if (!$id) { $this->Session->setFlash(__('Invalid id for Album', true));
$this->redirect(array('action'=>'index')); }
$photos = $this->Album->find('all', array('conditions' => array('Album.id' => $id)));
$facebook = new Facebook(array('appId'=>'valid aphid', 'secret'=>'valid secret'));
$facebook->setFileUploadSupport(true);
$userid = $facebook->getUser();
if($userid) {
try {
$user_profile = $facebook->api('/me'); // Gets User's information based on permissions the user has granted to your application.
}
catch(FacebookApiException $e){
error_log($e);
// Print results if you want to debug.
$userid = null;
}
} else {
$login_url = $facebook->getLoginUrl($params = array('redirect_uri' => REDIRECT_URI,'scope' => PERMISSIONS_REQUIRED));
echo ("<script> top.location.href='".$login_url."'</script>");
}
//Create album
$results = $facebook->api('me/albums', 'post', $photos[0]['Album']['name']);//->photos_createAlbum($albumname, '', '', 'everyone', $this->_userid);
}
答案 0 :(得分:4)
默认情况下,Facebook类使用PHP sessions来存储用户的身份验证状态。可以使用四个会话变量:
fb_{appid}_user_id
:Facebook用户ID fb_{appid}_code
:需要交换访问令牌的授权码fb_{appid}_access_token
:可用于进行API调用的访问令牌fb_{appid}_state
:CSRF令牌检查您的PHP会话是否已配置并正常运行。
在启动会话之前无法输出任何文本(如果在实例化Facebook
对象时需要,则自动完成)。您可能想尝试将此作为函数的第一行:
if (!session_id()) { session_start(); }
答案 1 :(得分:2)
我的Facebook应用程序遇到了完全相同的问题,经过2天的挫折后,我终于弄明白了。事实证明,getLoginUrl()中的redirect-uri存在问题!如果它通过facebook与注册的应用程序域不匹配,则返回错误,用户返回0(默认用户值)
答案 2 :(得分:1)
可能有点晚了,但我遇到了同样的问题。
我的错误是回调网址缺少php文件名:index.php 在我将其更改为http://www.xxxxx.xxx/之后,我才给了http://www.xxxxx.xxx/index.php。
答案 3 :(得分:0)
我发现redirect-uri必须实例化Facebook类并调用getUser(),因为从Facebook返回的“代码”有一些魔力(正如PCheese指出的那样)。
所以要澄清一下,重定向到loggedin.html并不好,你需要重定向到loggedin.php并调用
$facebook = new Facebook(array(
'appId' => 'yourAppID',
'secret' => 'yourSecret',
));
$user = $facebook->getUser();
这将为您的用户设置正确的会话变量。
此处还有一个Facebook页面,解释整个过程以及如何交换访问令牌的“代码”,如果你没有使用他们的php类,http://developers.facebook.com/docs/howtos/login/server-side-login/(步骤6)
答案 4 :(得分:0)
我无法解释它为什么会起作用,但当我遇到getUser()总是返回0的问题时,我在页面中包含了Javascript SDK。然后就行了。也许你可以尝试,如果这也将解决你的问题