facebook会话麻烦

时间:2010-08-23 20:17:38

标签: php facebook authentication

我有一个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有问题吗?

1 个答案:

答案 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会话数据。