2011-12-23 111 views
0

你应该如何处理前一段时间登录Facebook的人。来到你的网站,你应该继续链接(因为你发现他们已经登录到Facebook),然后在页面上,你指示他们给你这个错误。Facebook PHP SDK - OAuthException - OAuth2

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回似乎只告诉你有一个cookie。而不是,如果这将实际上工作,当你去做API调用。

UPDATE: 所以我用这种方法唯一的问题是什么?当用户确实对我的网站的cookie,但是API调用失败 - 我告诉他们Connect按钮。用户点击连接按钮,它很快出现并消失。因为它不是真正的'auth.login',所以用户不会通过JavaScript重定向发送到我的start.php页面。别人如何处理这个问题?我很难过。请告诉我,我是如何尝试这样做的,还有其他缺陷。

+0

是否检查该域名,APP_ID和app_secret是在这两个网站(您检查FB用户的一个存在,并在其上重定向一个)一样吗?并且用于在第一个网站上初始化Facebook对象的域应该是更高级别的域,然后是下一个网站。 – 2011-12-23 21:36:52

+0

这些都在同一个网站上。成功登录后,我想将我的用户从/(或index.php)重定向到start.php – BuddyJoe 2011-12-25 17:50:00

回答

0

你希望像这样写代码:

是的,你将不得不处理OAuthException

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

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

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

一旦成功登录后,用户会被重定向到重定向他的Facebook登录应用程序页面。

+0

让我问你这是否也是常见的,也将它纳入登录。如果您的Facebook登录失效(换句话说,您将保持登录Facebook全天),那么我将使用JavaScript SDK强制您注销并重新登录 - http:// stackoverflow。com/questions/2764436/facebook-oauth-logout – BuddyJoe 2011-12-27 21:32:53

+0

将用户重定向到getLoginUrl并不意味着您将他从Facebook注销;这意味着你不确定用户的状态,你想用facebbok检查。 AFA我明白你没有登录用户的访问令牌。换句话说,您的应用没有权限查询用户的“信息”。如果你有访问令牌(用于查询),那么你一定没问题。但你没有。这意味着您要么缺少权限,用户已注销,或者无法读取会话(从cookie或GET)。在这种情况下,您将用户重定向到Facebook登录 – 2011-12-30 19:06:20

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. 
}