PHP-SDK Facebook身份验证不断重定向


PHP-SDK Facebook auth keeps redirecting

我正在尝试将Facebook集成到我正在开发的web应用程序中。我从Facebook获得了一个api密钥和密钥,并将网站Url设置为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时,它会不断重定向回来,从而创建一个无限循环。

重定向url为:https://www.facebook.com/connect/uiserver.php?app_id=xxxxxxxxxxx&method=permissions.request&display=page&next=http%3A%2F%2Fwww.something.com%2something%2App%2Signup%2Fxxxxx%2F&response_type=代码&state=6f51768c22974a16b5dcf4d8dc7f46df&fbconnect=1

我在SO和谷歌上研究了其他类似的问题,并尝试了他们的解决方案,但这对我没有帮助。

[更新]

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

有什么想法吗?谢谢

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

事实上,是我.htaccess文件中的mod_rewrite把事情搞砸了。不知怎的,它没有获取FB设置的GET变量。所以我需要想办法解决这个问题。但至少我现在知道是什么导致了这个问题。案件结案!

我在某些浏览器上遇到过这个问题,最终导致浏览器阻塞了网站设置的cookie,从而阻塞了会话。

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

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

(它的PHP,你也可以通过HTML在元标签上完成(

看起来您使用的是旧版本的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/' )
    );
?>

目标url后面的脚本需要创建一个facebook对象实例,以便用户会话持久化。

我刚刚遇到了同样的问题。当我尝试在当前服务器中的另一台服务器上使用相同的代码(最新的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之前。

希望这能帮助到一些人!

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

@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而不是段落。

问题出在哪里?在试图弄清楚的时候,我把网站的url添加为"Facebook上的应用程序",这样就可以从Facebook内部访问它。eureka,如果以这种方式访问(通过Canvas Page url(,则getUser((可以正常工作。更重要的是,当你通过Canvas Page url链接访问后,当直接访问网站时,getUser((也能正常工作。

那么陷阱在哪里呢?尝试使用浏览器的隐姓埋名功能,我发现otu,用户浏览器上存储了一些东西。直接从浏览器访问网站,如果用户已经访问过Canvas Page url,则显示正确的响应,而在用户尚未访问Canvas Page url的浏览器上,则显示登录url。

所以它是无缝的,这个问题在某种程度上与浏览器缓存有关,而facebook在访问throught页面而不是Canvas页面时没有设置正确的方式。

有人知道如何只使用php-sdk来纠正这个问题吗?

编辑此外,当访问应用程序时,当用户点击登录链接时,重定向会返回到状态和代码为_GET参数的原始页面。