函数-getUser()中的Facebook身份验证返回0

函数-getUser()中的Facebook身份验证返回0,facebook,authentication,Facebook,Authentication,我正在尝试在我的控制器中创建一个功能,将相册发布到Facebook。每次访问该函数时,我都会被重定向到重定向URI,就像$userid=0一样,即使我刚刚正确登录到Facebook。这是因为在登录后,它会重新启动该功能并创建一个新的Facebook会话,删除我刚刚获得的用户吗 谢谢你能提供的帮助 function share($id){ if (!$id) { $this->Session->setFlash(__('Invalid id for Album

我正在尝试在我的控制器中创建一个功能,将相册发布到Facebook。每次访问该函数时,我都会被重定向到重定向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); 

        }
函数共享($id){
如果(!$id){$this->Session->setFlash(uuu('Invalid id for Album',true));
$this->redirect(数组('action'=>'index'));}
$photos=$this->Album->find('all',array('conditions'=>array('Album.id'=>$id));
$facebook=newfacebook(数组('appId'=>'validaphid','secret'=>'validsecret');
$facebook->setFileUploadSupport(true);
$userid=$facebook->getUser();
如果($userid){
试一试{
$user_profile=$facebook->api('/me');//根据用户授予应用程序的权限获取用户信息。
} 
捕获(FacebookApiException$e){
错误日志($e);
//如果要调试,请打印结果。
$userid=null;
}
}否则{
$login\u url=$facebook->getLoginUrl($params=array('redirect\u uri'=>redirect\u uri,'scope'=>PERMISSIONS\u REQUIRED));
echo(“top.location.href=”。$login\u url。””;
}
//创建相册
$results=$facebook->api('me/albums','post',$photos[0]['Album']['name']);//->photos\u createAlbum($albumname','','''everybody',$this->\u userid);
}

默认情况下,Facebook类用于存储用户的身份验证状态。可以使用四个会话变量:

  • fb{appid}\u用户id
    :Facebook用户id
  • fb{appid}\u code
    :需要交换访问令牌的授权代码
  • fb{appid}\u访问令牌
    :可用于进行API调用的访问令牌
  • fb{appid}\u状态
    :CSRF令牌
检查您的PHP会话是否已配置且工作正常

  • 默认情况下,cookie名称为PHPSESSID;您应该可以在浏览器中看到该设置
  • 如果要跨多台服务器进行负载平衡,则需要一种解决方案,使您能够跨这些服务器共享会话状态
  • 在开始会话之前,您不能输出任何文本(在实例化
    Facebook
    对象时,如果需要,将自动完成)。您可能希望尝试将其作为函数的第一行:

    if (!session_id()) { session_start(); }
    

我在Facebook应用程序上遇到了完全相同的问题,经过两天的挫折,我终于解决了这个问题。结果是getLoginUrl()中的重定向uri出现了问题!如果它与通过facebook注册的应用程序域不匹配,它们将返回错误,用户将返回为0(默认用户值)

我发现重定向uri必须实例化facebook类并调用getUser(),因为facebook返回的“代码”有一些魔力(正如PCheese指出的)

所以为了澄清,重定向到loggedin.html是没有用的,您需要重定向到loggedin.php并调用

$facebook = new Facebook(array(
  'appId'  => 'yourAppID',
  'secret' => 'yourSecret',
));

$user = $facebook->getUser();
这将为您的用户设置适当的会话变量


这里还有一个关于Facebook的页面,解释了整个过程以及如何为访问令牌交换“代码”,如果您不使用他们的php类,(步骤6)

我无法解释为什么它可以工作,但是当我遇到getUser()总是返回0的问题时,我在我的页面中包含了。然后它就起作用了。如果这也能解决你的问题,也许你可以试试。

可能有点晚了,但我也有同样的问题

我的错误是回调url,它缺少php文件名:index.php 我只是在把它改成有效的后才给的

可能重复的