2012-06-07 59 views
0

我有一个问题,PHP Facebook的SDK。 我已经阅读了许多文章谈论同样的问题(访问令牌无效,重定向循环等),但没有人可以帮助。Facebook的OpenGraph与Yii框架 - 身份验证问题

简单地说,我的项目是如何设计:

它是指仅与登录Facebook的用户运行一个Facebook应用程序。 使用Yii Framework,我创建了一个过滤器,每次加载页面时都会调用该过滤器,以确保只有通过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,但无论如何,我需要使用过滤器,因为我想确保这仍然是相同的用户(或因此如果用户已更改)。

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

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

在此先感谢。

+0

你到目前为止发现了什么问题。我遇到了同样的问题 –

回答

1

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

+0

您是否知道使用SDK来实现这一点的方法?通常,getUser()方法应该完成所有这些工作,但没办法,使用getUser(),即使我已注销,我也可以获得FB ID ...我也尝试清理会话/ cookie,以执行调用getUser(),以确保新的access_token将被请求,但现在!对api('/ me')的调用仍然告诉我没有活动的令牌。 – aramaki

0

看看yiiauth扩展。它仅在今天发布,并且可以与29个不同的提供商一起登录:Facebook,OpenID,Google,Twitter,Yahoo等。

它使用HybridAuth库和AFAICT,它使认证变得非常简单。

+0

谢谢Ors。我想要做的是一个隐含的身份验证。我不希望人们点击登录按钮或其他东西。我只想让他们在FB中自动登录我的应用程序。 yiiauth我认为这是不可能的。 – aramaki