带有Yii框架的Facebook OpenGraph - 身份验证问题

时间:2012-06-07 17:03:41

标签: php facebook yii infinite-loop access-token

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

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

这是一个Facebook应用程序,只能在登录Facebook的用户上运行。 使用Yii Framework,我创建了一个每次加载页面时调用的Filter,以确保只有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的请求已经完成。此时,a api('/ me')调用会生成一个异常,因为它无法找到任何有效的访问令牌,并开始在其上循环。

我可以补充说我的配置很好(或似乎是),我已根据Facebook的应用设置检查了我的所有网址,域名。 我也尝试过很多东西,例如重定向到一个新的特定URL,但无论如何我还需要使用过滤器,因为我想确保它仍然是同一个用户(或者如果用户已经改变了,则行动)。

唯一有效的方法是将用户重定向到没有Filter的页面(不会调用api(“/ me”))。然后,手动单击应用程序中的新链接,然后找到访问令牌。这不是我想要的行为。

我真的希望有人可以帮助我!

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

同时查看yiiauth扩展程序。它仅在今天发布,有了它,您可以登录29个不同的提供商:Facebook,OpenID,谷歌,Twitter,雅虎等。

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