Facebook OpenGraph with Yii Framework - Authentication Issue


Facebook OpenGraph with Yii Framework - Authentication Issue

我在使用 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") 的调用)。然后,手动单击应用程序中的新链接,在那里找到访问令牌。这不是我想要的行为。

真的希望有人能帮助我!

提前谢谢。

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

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

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