我在使用 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"))。然后,手动单击应用程序中的新链接,并在那里找到访问令牌。这不是我想要的行为。
我真的希望有人能帮助我!
提前致谢。