我正在尝试将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参数的原始页面。