PHP-SDK Facebook auth保持重定向

时间:2011-08-21 18:23:56

标签: php facebook facebook-php-sdk

我正在尝试将Facebook整合到我正在处理的网络应用中。我从Facebook获得了api密钥和密钥,并将网站网址设置为http://www.mysite.com/something/app/

以下代码用于http://www.mysite.com/something/app/signup/xxxx/来检测用户是否已连接:

        $facebook = new Facebook(array(
          'appId'  => FB_APIKEY,
          'secret' => FB_SECRETKEY,
          'cookie' => true  
        ));

        $session = $facebook->getUser();

        if($session) {
            # Active session, let's try getting the user id (getUser()) and user info (api->('/me'))
            try{
                $uid = $facebook->getUser();
                $user = $facebook->api('/me');
            } catch (Exception $e){}

            if(!empty($user)){
                # User info ok? Let's print it (Here we will be adding the login and registering routines)
                echo $user;
            } else {
                # For testing purposes, if there was an error, let's kill the script
                die("There was an error.");
            }
        } else {
            # There's no active session, let's generate one
            $login_url = $facebook->getLoginUrl();
            header("Location: ".$login_url);
        }

但问题是,当用户被重定向到$ login_url时,它会继续重定向,从而创建一个无限循环。

重定向网址为:https://www.facebook.com/connect/uiserver.php?app_id=xxxxxxxxxxx&method=permissions.request&display=page&next=http%3A%2F%2Fwww.something.com%2Fsomething%2Fapp%2Fsignup%2Fxxxxx%2F&response_type=code&state=6f51768c22974a16b5dcf4d8dc7f46df&fbconnect=1

我已经在SO上看过其他类似的问题了,也在Google上看过并试过他们的解决方案,但它并没有帮助我。

[UPDATE]

好的,我想我正在做点什么。如果我以不同的Facebook用户身份登录,我不会被重定向到循环中。它似乎只有在我使用我自己的Facebook帐户时才会发生,这是应用程序的管理员。但是在重定向之后它应该返回getUser()吧..但它不是出于某种原因。

有什么想法吗?感谢。

5 个答案:

答案 0 :(得分:3)

我从头开始从我的服务器的根目录下创建一个新的.php文件。一切都工作正常,所以我发现我自己的代码导致网页重定向。

事实上,我的.htaccess文件中的mod_rewrite就像搞砸了一样。不知怎的,它没有拿起FB设置的GET变量。所以我需要为它找出一些东西。但至少我现在知道是什么导致了这个问题。结案!

答案 1 :(得分:1)

看起来您正在使用旧版本的PHP SDK,其代码可以与最新版本一起使用。将PHP SDK升级到最新版本 - v3.1.1

https://github.com/facebook/php-sdk

然后该代码应该有效。


您是否尝试过指定重定向uri:

<?php
    $loginUrl = $facebook->getLoginUrl(
        array( 'redirect_uri' => 'http://www.mysite.com/something/app/' )
    );
?>

目标网址背后的脚本需要创建一个facebook对象实例,以便用户会话保持不变。

答案 2 :(得分:1)

我在某些浏览器上遇到过这个问题,最后通过阻止网站设置的cookie以及会话来阻止浏览器出错。

尝试将此添加到您的网页:

header('P3P: CP="CAO PSA OUR"');

(它的PHP,您也可以通过HTML在元标记上进行)

答案 3 :(得分:1)

我刚遇到同样的问题。当我尝试使用当前服务器中另一台服务器上运行的相同代码(最新的FB SDK)时,发生了无限重定向循环。

当我开始调试它时,我发现原因是因为当前服务器$_REQUEST似乎没有处理$_GET中的值。因此,$_GET['state']$_GET['code']都无法在$_REQUEST中读取。在base_facebook.php中,似乎他们使用$_REQUEST代替$_GET来获取代码和州值。

因此,对此的简单修复是包含以下代码:

$_REQUEST['state'] = $_GET['state'];
$_REQUEST['code'] = $_GET['code'];

在facebook SDK文件的require_once之前。

希望这能帮助那里的一些人!

答案 4 :(得分:1)

我在这里遇到同样的问题。 这是一个简单的代码,它运行在一个站点上,并且尽可能简单:

@ini_set('log_errors','On'); // enable or disable php error logging (use 'On' or 'Off')
@ini_set('display_errors','On'); // enable or disable public display of errors (use 'On' or 'Off')
include_once('lib/facebook.php');

// Create our application instance
$config = array(
  'appId' => 'xx',
  'secret' => 'yyy'
);
$link = 'http://someurl.com';
$facebook = new Facebook($config);

// Get User ID
$user = $facebook->getUser();

if($user){ ?>
    <p>logged in</p>
<?php } else {
    $loginUrl = $facebook->getLoginUrl(array(
    'scope'         => 'manage_pages,email',
    'redirect_uri'  => $link,
    ));
    echo '<a href="'.$loginUrl.'">Login with FB</a>'; 
}

所以id是什么,它显示用户未登录时的登录链接(或具体 - 如果getUser()没有任何东西),如果getUser给出应该给出的内容,则显示带有文本的段落。

简单测试会显示问题。即使授予用户权限,也可以通过站点URL访问它,显示登录URL而不是段落。

问题出在哪里? 在尝试解决这个问题时,我已将网站的网址添加为“Facebook上的应用”,因此可以从Facebook内部访问。而eureka,如果以这种方式访问​​(通过Canvas Page url),getUser()可以正常工作。更何况,一旦你通过Canvas Page url链接访问过,那么当直接访问网站时 - getUser()也能正常工作。

那捕获量在哪里? 尝试使用浏览器的隐身功能我已经想到了otu,用户浏览器上存储了一些东西。直接从浏览器访问站点,用户已经在Canvas Page url上显示正确的响应,而当用户没有访问Canvas Page url的浏览器时,显示登录URL。

所以它接缝,问题以某种方式与浏览器缓存相关联,并且在访问整个页面而不是Canvas Page本身时,facebook没有设置正确的方法。

任何人都知道如何使用php sdk解决这个问题?

修改 此外,当给出对app的访问时,当用户点击登录链接时,重定向返回到具有状态和代码作为_GET参数的原始页面。