我遇到了php Facebook sdk的问题。 我已经阅读了许多关于同一类问题的帖子(访问令牌无效,重定向循环等等)但没有人可以提供帮助。
简而言之,我的项目是如何设计的:
这是一个Facebook应用程序,只能在登录Facebook的用户上运行。 使用Yii Framework,我创建了一个每次加载页面时调用的Filter,以确保只有Facebook登录用户才能看到内容。 它的行为应该与Facebook上的应用程序BranchOut完全相同。
我的问题,以及如何重现它:
以下是我的过滤器的代码:
$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”))。然后,手动单击应用程序中的新链接,然后找到访问令牌。这不是我想要的行为。
我真的希望有人可以帮助我!
提前致谢。
答案 0 :(得分:1)
尝试新登录后,您应该在重定向到的URL中获取新代码。因此,请查找该代码参数,如果存在,请将其替换为新的访问令牌。
答案 1 :(得分:0)
同时查看yiiauth扩展程序。它仅在今天发布,有了它,您可以登录29个不同的提供商:Facebook,OpenID,谷歌,Twitter,雅虎等。
它使用HybridAuth库和AFAICT,它使身份验证变得非常容易。