0

请调试,这是我网站上的一个 PHP 页面,用于处理应用程序的 Facebook 权限。

问题 - 我的用户应该:
>>单击我网站上的链接(“安装链接”)
>>发送到页面:install.php处理 Facebook 身份验证的页面
>>然后重定向到登录页面:index.php

当用户点击链接时,原来是:

http://SITE.COM/install.php?cover=image.jpg&id=001&title=TITLE+HERE

在 Firefox 上,会发生这种情况- 用户被重定向到我无法弄清楚的无限循环,并且它永远不会结束或停止。
(我已经在 3 个浏览器上尝试过:Chrome、Firefox 和 Safari -这只发生在 FIREFOX 上

    http://SITE.COM/install.php?cover=image.jpg&id=001&title=TITLE+HERE&state=df50b9c92366fe3167a561b74b570ab1&code=AQAnWnd4lcDVUhb34F5OTnE4ef9y_H3wqRarcse69ELjf5cWeT_MvAbMkIELaUDeoDCTyyge3FrbLNbhnbInAF0ksk9LREmkOygzXN1WDja_yGdSmZS_z_LfL2JtCfIFZKO72ilIkCUPFy5GmoKyQf_XEEacG1Wxp5jnRD-nJeEdiq8tjVYbK0Q6LpD2r_RIhh2SnFfra_MbZu_rBEOyiHx1#_=_

添加了新参数:&state=&code=,这些新参数通过刷新自身和生成新变量使浏览器保持忙碌。这就像一个永无止境的等待。

这是install.php处理事情的页面:(
假设建立了数据库连接并且正确填写了appId和Secret)

  require_once('./facebook.php'); // FACEBOOK LIBRARY
  $config = array(
  'appId' => '#',
  'secret' => '#',
  'fileUpload' => true,
  );

  $facebook = new Facebook($config);
  $user_id = $facebook->getUser();

  define('REDIRECT_URI',"http://SITE.COM/covers/index.php?cover=uploaded&id=".$_GET['id']."&title=".$_GET['title']."");

// GET IMAGE FROM URL
  $img = $_GET['cover'];
  $photo = './covers/'.$img.''; // PATH TO THE PHOTO ON THE LOCAL FILESYSTEM
  $caption = 'I found this Cover at <3 http://SITE.COM';

    if($user_id) {

      try {
        // UPLOAD PHOTO TO USER'S PROFILE
        $ret_obj = $facebook->api('/me/photos', 'POST', array(
                                         'source' => '@' . $photo,
                                         'message' => $caption
                                         )
                                      );


        $login_url = $facebook->getLoginUrl($params = array('redirect_uri' => REDIRECT_URI));
        echo ("<script> top.location.href='".$login_url."'</script>");

      } catch(FacebookApiException $e) {
        $login_url = $facebook->getLoginUrl( array(
                       'scope' => 'email,status_update,publish_stream,photo_upload'
                       )); 
        echo '<script> window.location = "' . $login_url . '"; </script>';
        error_log($e->getType());
        error_log($e->getMessage());
      }   
    $api_call = array(
        'method' => 'users.hasAppPermission',
        'uid' => $user_id,
        'ext_perm' => 'publish_stream'
    );
    $can_post = $facebook->api($api_call);
    if ($can_post) {
    $user = $facebook->api('/me');
    $photolink = 'http://graph.facebook.com/'.$user['id'].'/picture';

            # ACTIVE SESSION, CHECK IF THE USER HAS ALREADY REGISTERED
            $query = mysql_query("SELECT * FROM users WHERE account = 'facebook' AND userId = " . $user['id']);
            $result = mysql_fetch_array($query);


            # IF NOT, ADD USER TO DATABASE
            if (empty($result)) {
                $query = mysql_query("INSERT INTO users (oauth_uid, userId, username, first_name, last_name, email, picture, account) VALUES ('facebook', '{$user['id']}', '{$user['name']}', '{$user['first_name']}', '{$user['last_name']}','{$user['email']}', '".$photolink."', 'facebook')");
                $query = mysql_query("SELECT * FROM users WHERE id = " . mysql_insert_id());
                $result = mysql_fetch_array($query);
            }




        # NOW POST THIS ON USER'S TIMELINE
        $facebook->api('/' . $user_id . '/feed', 'post', array(
            'message' => 'JUST A TEST!',
            'name' => 'APP TESTING',
            'description' => 'THIS IS A TEST',
            'caption' => 'This is just a TEST! Hooray!',
            'picture' => 'http://test.com/test.jpg',
            'link' => 'http://SITE.COM/'
        ));
        echo 'Posted!';
    } else {
        die('Permissions required!');
    }
      echo '<br /><a href="' . $facebook->getLogoutUrl() . '">logout</a>';
    } else {

      // NOT LOGGED IN
      $login_url = $facebook->getLoginUrl( array( 'scope' => 'email,status_update,publish_stream,photo_upload') );
        echo '<script> window.location = "' . $login_url . '"; </script>';

    }

(该脚本在 Chrome 和 Safari 上按预期工作。)

我是唯一一个对此进行测试的人,所以当我说“用户”时,我实际上只是指我自己。;o)
我的 cookie 没有被禁用,所以我不认为就是这样。

谁能弄清楚发生了什么?谢谢你的时间,我很感激。


如果我的 Facebook 上没有安装该应用程序,它实际上会使用以下 URL 进入oauth 对话框页面

https://www.facebook.com/dialog/oauth?client_id=225230310923314&redirect_uri=http%3A%2F%2FWWW.SITE.COM%2Fcovers%2Finstall.php%3Fcover%3D685970AG58759_1338938036.jpg%26id%3D151%26title%3DZoidberg%2Bof%2BFuturama&state=f4bb3c13a2392fe0e24c3dc539e18aae&scope=email%2Cpublish_stream%2Cphoto_upload

然后,如果您继续,则在此 URL 请求额外的权限:

https://www.facebook.com/dialog/permissions.request

所以至少我们知道它走了那么远......
现在在这个页面上,我害怕点击“允许”,因为不可避免的重定向会发生。

但无论如何,请允许...

奇怪的是,它重定向到 BACK to install.php... 即使它应该转到index.php现在。难怪它循环!但问题是,我不知道如何解决这个问题。@_@

添加'redirect_uri' => 'INDEX.PHP'使它停止在 Chrome 和 Safari 上工作(正确重定向但不发布图像等),虽然它修复了 Firefox 中的重定向错误,但它不会执行脚本中指定的任何操作(例如发布、上传等),所以我们现在有 3 个浏览器,而不是只有 1 个浏览器。

所以这显然不是解决方案。


编辑- 在尝试了一切之后,我意识到我是唯一一个遇到这个问题的人,它适用于其他人。所以,耶!


编辑:解决方案- 好吧,我正在更新这个,让我实际做过的每个人都找到导致无限重定向循环的问题。

造成这种情况的原因是 Facebook 库正在吐出一个错误(APP 内缺少隐私政策),并且每次发生这种情况时,它都会将用户返回到它所在的最后一个页面(特别是 install.php 页面) ,但是因为我的脚本将用户发送到 Facebook,这就是它进入无限循环的原因。Facebook 会继续将用户发送回去,而我的脚本会继续将用户发送到 Facebook。

我通过注释掉// throw $e;Facebook 库中的所有内容以抑制错误来解决了这个问题。

这些错误与代码无关。

4

3 回答 3

3

我的 cookie 没有被禁用,所以我认为不是这样。

不要假设——检查…!

结合重定向设置的 Cookie 有时会很棘手。也许最好不要依赖cookie,而是以它应该工作的方式实现服务器端身份验证。

于 2012-06-07T20:35:26.007 回答
1

解决方案:嗯,我正在更新这个,让大家知道我确实找到了导致无限重定向循环的问题。(这也是一个相当晚的更新,就像晚了几年一样,但无论如何......)

造成这种情况的原因是 Facebook 库正在吐出一个错误(在 APP 中缺少隐私政策/ Facebook 对所有 APP 的要求),每次发生这种情况时,它都会将用户返回到它所在的最后一页(特别是install.php页面),但是因为我的脚本将用户发送到 Facebook,所以它只是进入了无限循环。
Facebook 会继续将用户发送回来,而我的脚本会继续将用户发送到 Facebook。

我通过注释掉throw $e;Facebook 库中的所有内容以抑制错误来解决了这个问题。因为这只是因为缺少隐私政策并且没有任何代码相关,所以这样做感觉很好。

这些错误与代码无关。

于 2013-06-06T09:20:18.303 回答
0

我遇到了同样的问题。我检查了几次代码,似乎一切正常。完成所有操作后,我检查了我的应用程序 ID 和密码,并意识到(愚蠢的我)配置数组中的密码是错误的。更改密码后,刷新问题消失。如果您仅在 IE 中遇到此问题,请尝试将header('P3P: CP="CAO PSA OUR"');其放在页面顶部。

于 2012-06-11T22:51:48.173 回答