【问题标题】:Facebook PHP SDK - OAuthException - OAuth2Facebook PHP SDK - OAuthException - OAuth2
【发布时间】:2012-01-27 00:46:44
【问题描述】:

您应该如何与不久前登录 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 的签名信息有关吗?似乎这个签名信息可能会过期(它有一个 issue_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 页面。其他人如何处理这个问题?我难住了。请告诉我我在尝试这样做时是否还有其他缺陷。

【问题讨论】:

  • 您是否检查过两个站点上的域名、app_id 和 app_secret 是否相同(您检查 fb 用户存在的站点和您重定向的站点)?并且用于在第一个站点上初始化 facebook 对象的域应该是一个更高级别的域然后在下一个站点上。
  • 这都在同一个站点上。成功登录后,我想将我的用户从 /(或 index.php)重定向到 start.php

标签: facebook facebook-php-sdk oauth-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.
}

【讨论】:

    【解决方案2】:

    你是否希望编写这样的代码:

    是的,您必须处理OAuthException

    但您可以将用户重定向到应用程序的 facebook 登录 URL,而不是使用 FBML 登录按钮。您可以使用 Facebook PHP SDK 提供的函数getLoginUrl 获取 url。请参阅getLoginUrl 了解更多信息。

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

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

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

    【讨论】:

    • 让我问你这个......是否也将其合并到登录中很常见。如果您的 Facebook 登录已过时(换句话说,您整天都在登录 Facebook),那么我将使用 Javascript SDK 强制您注销并重新登录 - stackoverflow.com/questions/2764436/facebook-oauth-logout
    • 将用户重定向到 getLoginUrl 并不意味着您将他从 facebook 中注销;这意味着您不确定用户的状态,并且您想使用 facebbok 进行检查。 AFA 我了解您没有登录用户的访问令牌。换句话说,您的应用无权查询用户的“the”信息。如果您获得了访问令牌(用于查询),那么您一定没问题。但你没有。这意味着您要么缺乏权限,要么用户已注销,要么您无法读取会话(从 cookie 或 GET)。在这种情况下,您将用户重定向到 facebook 登录
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多