【问题标题】:Converting Facebook session keys to access tokens将 Facebook 会话密钥转换为访问令牌
【发布时间】:2013-07-19 23:23:55
【问题描述】:

我有一个网络应用程序,允许用户将 Facebook 帐户与他们在我网站上的帐户连接起来。当用户决定连接 Facebook 时,应用程序会请求 publish_stream 和 offline_access 权限,然后为每个用户存储 Facebook uid 和 session_key。这一切现在都很好。

我的问题是迁移到 Facebook 的新 OAuth 2.0 系统。我想将我拥有的会话密钥转换为访问令牌。我关注了these instructions,一切似乎都很好; Facebook 返回了一堆访问令牌。但是,它们都不起作用。当我尝试访问诸如 https://graph.facebook.com/me?access_token=TOKEN-HERE 之类的 URL 时,我收到一条错误消息,提示“验证客户端时出错”。

我做错了什么?

另外,我的印象是访问令牌就像会话密钥一样工作,一旦我拥有一个,我就可以永远使用它(因为我请求offline_access 权限)。对吗?

更新:

以下是我将会话密钥转换为访问令牌所采取的确切步骤,以及我得到的输出。希望这将有助于解决我的问题。

第 1 步:将会话密钥转换为访问令牌

代码:

$session_key = '87ebbedf29cc2000a28603e8-100000652996522';
$app = sfConfig::get('app_facebook_prod_api'); // I happen to use Symfony. This gets an array with my Facebook app ID and secret.
$post = array(
  'type' => 'client_cred',
  'client_id' => $app['app_id'],
  'client_secret' => $app['secret'],
  'sessions' => $session_key
);

$options = array(
  CURLOPT_POST => 1,
  CURLOPT_HEADER => 0,
  CURLOPT_URL => 'https://graph.facebook.com/oauth/exchange_sessions',
  CURLOPT_FRESH_CONNECT => 1,
  CURLOPT_RETURNTRANSFER => 1,
  CURLOPT_POSTFIELDS => http_build_query($post)
);

$ch = curl_init();
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
curl_close($ch);
var_export(json_decode($result));

输出:

array (
  0 => 
  stdClass::__set_state(array(
     'access_token' => '251128963105|87ebbedf29cc2000a28603e8-100000652996522|Dy8CcJzEX8lYRrJE9Xk1EoW-BW0.',
  )),
)

第 2 步:测试访问令牌

代码:

$access_token = '251128963105|87ebbedf29cc2000a28603e8-100000652996522|Dy8CcJzEX8lYRrJE9Xk1EoW-BW0.';
$options = array(
  CURLOPT_HEADER => 0,
  CURLOPT_URL => 'https://graph.facebook.com/me?access_token=' . $access_token,
  CURLOPT_FRESH_CONNECT => 1,
  CURLOPT_RETURNTRANSFER => 1,
);

$ch = curl_init();
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
curl_close($ch);
var_export(json_decode($result));

输出:

stdClass::__set_state(array(
   'error' => 
  stdClass::__set_state(array(
     'type' => 'OAuthException',
     'message' => 'Error validating client.',
  )),
))

【问题讨论】:

    标签: facebook oauth


    【解决方案1】:

    阅读您的帖子,这是我的理解 -

    您正在将会话密钥转换为系统中每个用户的访问密钥并存储这些密钥。

    然后您使用自己的页面测试密钥。 (Graph.facebook.com/me 等...)

    如果是这样的话

    A) 您不能将其他用户密钥与您自己的密钥一起使用。访问 graph.facebook.com 仅对密钥所属的用户有效并且如果他们已登录。例如,如果您有我的访问密钥,则可以访问 http://graph.facebook.com/YOURID....) 但对于 graph.facebook。 com/me 要工作,您必须以我的身份登录。

    B)这些密钥每 3 小时(或大约)过期一次,因此它可能不再有效。

    【讨论】:

    • A 不正确。如果您阅读了developers.facebook.com/docs/api#authorization 上的最后一条说明,这似乎暗示提供访问令牌意味着 API 的行为就像您是令牌所针对的人一样。事实上,如果你为自己获得了一个令牌然后退出,你仍然可以去 /me。
    • 刚刚检查过,好的 - 所以当您登录时,您可以访问 graph.facebook.com/me。但是,如果您注销密钥被终止,则该密钥也将过期。您确定在尝试测试时使用的是活动密钥吗?
    • 我可以根据经验说,访问令牌肯定会在注销时过期,但如果您有 offline_access 权限,它们不应该过期。您确定您已获得 offline_access 权限吗?
    【解决方案2】:

    Platform Upgrade Guide 有一个关于 OAuth 2.0 的部分,其中包括将 session_key 交换为 access_token 的说明。如果您已经存储了会话密钥,则应该使用它。

    对于新用户,您应该使用新的 SDK 之一或直接使用 OAuth2 flow,这将为您提供访问令牌。

    【讨论】:

    • 这是发帖者指定他已阅读并正在关注的问题中提供的确切链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2020-10-09
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多