0

我在使用 php Facebook sdk 时遇到问题。我已经阅读了许多关于相同类型问题的帖子(访问令牌无效、重定向循环等),但没有一个可以提供帮助。

简而言之,我的项目是如何设计的:

它是一个 Facebook 应用程序,仅适用于登录 Facebook 的用户。使用 Yii 框架,我创建了一个过滤器,每次加载页面时都会调用它,以确保内容仅对 Facebook 登录用户可见。它的行为应该与 Facebook 上的应用程序 BranchOut 完全相同。

我的问题,以及如何重现它:

  • 我使用来自 Facebook 的典型登录过程(OAuth,访问令牌)登录到我的应用程序
  • 我在 Facebook 页面上手动注销,然后尝试在我的应用程序上执行新操作
  • 过滤器检查我是否登录 Facebook,因为我没有登录,它会将我重定向到 Facebook 登录页面。
  • 再次登录 Facebook 后,我在 Facebook 和我的应用程序的过滤器之间得到了典型的无限循环。

这是我的过滤器的代码:

$fb_logged = false;
try
{
    $user = Yii::app()->facebook->getUser();
    $me = Yii::app()->facebook->api('/me');
    $fb_id = $me['id'];
    $fb_logged = true;
}
catch (Exception $e)
{
    $fb_logged = false;
}

if($fb_logged)
{
    print_r($fb_id. ' has logged');
    /* Check if user exists on MyApp 
     ... */
}
// If user NOT logged on FB, send him to the FB login page
else
{
    $loginUrl = Yii::app()->facebook->getLoginUrl(array(
                'redirect_uri' => Yii::app()->getRequest()->getUrl() // I have tried many things here.
        ));
    echo("<script> top.location.href='" . $loginUrl . "'</script>");
    Yii::app()->end();
}

实际发生的情况是,在 FB 上登录后,再次调用过滤器,因为对同一 URL 进行了请求。那时,对 api('/me') 的调用会产生异常,因为它找不到任何有效的访问令牌,并开始在其上循环。

我可以补充一点,我的配置很好(或者看起来很好),我已经根据 Facebook 的应用程序设置检查了我所有的网址和域名。我也尝试过很多事情,比如重定向到一个新的特定 URL,但无论如何我也需要使用过滤器,因为我想确保这仍然是同一个用户(或者如果用户发生了变化,则采取相应的行动)。

唯一可行的是将用户重定向到没有过滤器的页面(没有调用 api("/me"))。然后,手动单击应用程序中的新链接,并在那里找到访问令牌。这不是我想要的行为。

我真的希望有人能帮助我!

提前致谢。

4

2 回答 2

1

在您进行新的登录尝试后,您应该会在重定向到的 URL 中获得一个新代码。因此,查找该代码参数,如果存在,请将其交换为新的访问令牌。

于 2012-06-07T17:19:08.630 回答
0

看看yiiauth扩展。它今天刚刚发布,您可以使用它登录 29 个不同的提供商:Facebook、OpenID、Google、Twitter、Yahoo 等。

它使用HybridAuth库和 AFAICT,使身份验证变得非常容易。

于 2012-06-11T13:03:24.300 回答