我有一个facebook iframe facebook app。在每个页面的顶部,我从包含的php示例运行身份验证脚本。出于某种原因,如果我登录一个Facebook帐户,访问我的应用程序,登出Facebook并进入新帐户,当我访问该应用程序时,我仍然作为第一个用户进行身份验证。
为什么会话仍然存在?为什么Facebook库没有意识到它无效?
请帮忙。
这是我在每个页面顶部包含的身份验证脚本。它几乎与示例相同。唯一的变化是我添加了一行来通过登录URL传递GET参数。
$uid = null; //facebook user id
require_once "facebook.php";
// Create our Application instance.
$facebook = new Facebook(array(
'appId' => $conf['fb']['appid'],
'secret' => $conf['fb']['secret'],
'cookie' => true,
));
if (is_numeric($_GET['user_id'])) {$user['id'] = $_GET['user_id']; $loginUrlParam = '?user_id='.$_GET['user_id'];}
//Facebook Authentication part
$session = $facebook->getSession();
$loginUrl = $facebook->getLoginUrl(
array(
'canvas' => 1,
'fbconnect' => 0,
'req_perms' => 'publish_stream',
'next' => $conf['dir']['app_url'].$loginUrlParam
)
);
$fbme = null;
if ($session) {
try {
$uid = $facebook->getUser();
$fbme = $facebook->api('/me');
} catch (FacebookApiException $e) {
echo "<script type='text/javascript'>top.location.href = '$loginUrl';</script>";
exit;
}
}
print_r($fbme);
更新
刚发现一些非常奇怪的东西。我可以在两个浏览器中登录facebook。我知道,如果我从一个浏览器登录到一个浏览器,它会将我从另一个浏览器中注销掉。 facebook atm有问题吗?
答案 0 :(得分:1)
您的问题实际上是问题的组合
首先,您在Facebook
类的实例上启用了Cookie支持。如果Facebook::getSession()
中未提供会话,则会触发$_REQUEST
在Cookie中查找会话。
而且,通过这段代码的外观,由于你在之前获得会话知道用户是谁,所以仍然在cookie中的旧会话被选中。
请记住,退出Facebook无法删除/删除 域中的会话Cookie。
你有几种解决方法。如果您要启用cookie支持,那么当未识别的用户访问应用程序时,您需要确保正确重置该cookie。这是你必须在画布页面的新负载上做的事情 - 而不是包含在应用程序的每个页面中的内容。
$facebook = new Facebook(array(
'appId' => $conf['fb']['appid'],
'secret' => $conf['fb']['secret'],
'cookie' => true,
));
// Calling this w/no parameters will clear the session
$facebook->setSession();
您也可以关闭Cookie支持,但您还需要手动维护会话ID和Facebook会话数据。