Facebook PHP SDK - OAuthException - OAuth2

时间:2011-12-23 19:08:27

标签: facebook facebook-php-sdk oauth-2.0

你应该如何处理刚刚登录Facebook的人?来到你的网站你应该给他们一个继续链接(因为你发现他们已经登录到Facebook),然后在你指导他们的页面上得到这个错误。

Fatal error: Uncaught OAuthException: An active access token must be used to query information about the current user. thrown in /var/www/html/lib/base_facebook.php on line 1039

我不明白你应该如何防止这种情况?这是否与您提交给Facebook以获取access_token的签名信息有关?好像这个签名信息可以过期(它有一个issued_at日期)。在您的网站流程中处理此问题的正确方法是什么?

您是否应该编写如下代码:

<?php 
$user = $facebook->getUser();
try {
  // attempt to do a call just to see if you are going to have this issue
  $profile = $facebook->api('/me'); 
} catch (Exception $e) {
  $user = false;
}
if ($user) { ?>
  <a href="start.php">Begin</a>
<?php } else { ?>
    <fb:login-button scope="email" size="large">Connect</fb:login-button>
<?php } ?>

而不是:

<?php 
$user = $facebook->getUser();
if ($user) { ?>
  <a href="start.php">Begin</a>
<?php } else { ?>
    <fb:login-button scope="email" size="large">Connect</fb:login-button>
<?php } ?>

从Facebook SDK中取回$ user似乎只是告诉你有一个cookie。而不是当你去做API调用时它会真正起作用。

更新: 所以这个方法的唯一问题是......当用户确实在我的网站上有cookie但API调用失败时 - 我向他们展示了连接按钮。用户单击连接按钮,它会快速显示并消失。因为它不是真正发生的'auth.login',所以用户不会通过JavaScript重定向发送到我的start.php页面。别人怎么处理这个?我很难过。请告诉我是否还有其他缺陷,我试图这样做。

2 个答案:

答案 0 :(得分:1)

尝试将访问令牌传递给API调用,以验证用户是否已授权您的应用程序。以下是我的工作,它应该有助于减轻您获得的OAuthException。

$user = $facebook->getUser();

if($user) {
    $access_token = $facebook->getAccessToken();
    $params = array('access_token' => $access_token);
    try {
        $me = $facebook->api("/me", $params);
    } catch(FacebookApiException $e) {
        $user = null;
    }
}

if($me) {
    // proceed with authenticated user with an active access token.
}

答案 1 :(得分:0)

  

您是否应该编写如下代码:

是的,您必须处理OAuthException

但是,您可以将用户重定向到您的应用程序的Facebook登录URL,而不是使用FBML登录按钮。您可以使用Facebook PHP SDK提供的函数getLoginUrl获取网址。有关详细信息,请参阅getLoginUrl

对于您的电子邮件权限,您可以使用以下数组:

$params = array( 'scope' => 'email' );

成功登录后,用户将被重定向回应用程序页面,并将其重定向到facebook登录。