功能中的Facebook身份验证 - getUser()返回0

时间:2011-09-09 20:27:06

标签: facebook authentication

我正在尝试在我的控制器中创建一个功能,将专辑发布到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); 

        }

5 个答案:

答案 0 :(得分:4)

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

  • fb_{appid}_user_id:Facebook用户ID
  • fb_{appid}_code:需要交换访问令牌的授权码
  • fb_{appid}_access_token:可用于进行API调用的访问令牌
  • fb_{appid}_state:CSRF令牌

检查您的PHP会话是否已配置并正常运行。

  • 默认情况下,Cookie名称为PHPSESSID;你应该看到在你的浏览器中设置了。
  • 如果您在多台服务器之间进行负载平衡,则需要一个可让您在这些服务器之间共享会话状态的解决方案。
  • 在启动会话之前无法输出任何文本(如果在实例化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。然后就行了。也许你可以尝试,如果这也将解决你的问题