繁体   English   中英

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

[英]PHP-SDK Facebook auth keeps redirecting

我正在尝试将Facebook集成到我正在开发的Web应用程序中。 我从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 =代码&状态= 6f51768c22974a16b5dcf4d8dc7f46df&fbconnect = 1

我在SO上以及Google上都看过其他类似的问题,并尝试过他们的解决方案,但这并没有帮助我。

[UPDATE]

好吧,我想我正在做某事。 如果我以其他Facebook用户身份登录,则不会被循环重定向。 似乎只有当我使用自己的Facebook帐户(该应用程序的管理员)时才会发生。 但是在重定向之后,它应该正确返回getUser()。但是由于某种原因,它没有。

有任何想法吗? 谢谢。

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

实际上,正是我的.htaccess文件中的mod_rewrite弄得一团糟。 不知何故,它没有选择FB设置的GET变量。 所以我需要弄清楚一些东西。 但是至少我现在知道是什么原因引起的。 结案!

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

当我开始调试它时,我发现原因是因为当前服务器$_REQUEST似乎$_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而不是段落。

问题出在哪儿? 在尝试弄清楚时,我将网站的网址添加为“ Facebook上的应用”,以便可以从Facebook内部访问它。 还有eureka,如果通过这种方式(通过Canvas Page url)进行访问,则getUser()可以正常工作。 更重要的是,一旦您通过“画布页面” URL链接进行了访问,然后直接访问了站点,则getUser()也可以正常工作。

那么渔获量在哪里? 尝试使用浏览器的隐身功能时,我已经想到otu,用户浏览器中存储了一些内容。 直接从浏览器访问网站(用户已经在“画布页面” URL上)显示正确的响应,而在浏览器上用户没有访问“画布页面” URL时,显示登录URL。

因此,它暗示了问题是与浏览器缓存有关,Facebook在访问整个页面而不是Canvas页面本身时未设置正确的方式。

有人有一个想法如何纠正仅与php sdk一起使用的问题吗?

编辑也,当给应用程序访问权限时,当用户单击登录链接时,重定向将以状态和代码作为_GET参数返回到原始页面。

您似乎正在使用旧版本的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对象实例,以使用户会话持久化。

我在某些浏览器上遇到了这个问题,最终由于阻止站点设置的cookie以及会话而导致了浏览器故障。

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

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

(它是PHP,您也可以通过HTML在meta标记上执行此操作)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM