将Facebook会话密钥转换为访问令牌

时间:2010-07-15 20:33:32

标签: facebook oauth

我有一个网络应用程序,允许用户将Facebook帐户与我们网站上的帐户连接。当用户决定与Facebook连接时,该应用会请求publish_streamoffline_access权限,然后为每个用户存储Facebook uidsession_key。所有这一切现在都很好。

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

我做错了什么?

此外,我的印象是访问令牌就像会话密钥一样,一旦我有了会话密钥,我就可以永远使用它(因为我请求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.',
  )),
))

2 个答案:

答案 0 :(得分:1)

从阅读你的帖子这里是我的理解 -

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

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

如果是这种情况

A)您不能使用自己的密钥使用其他用户密钥。转到graph.facebook.com只对该密钥所属的用户以及他们是否已登录有效。例如,如果您有我的访问密钥,则可以访问http://graph.facebook.com/YOURID...。)但是对于图表。 facebook.com/me工作你必须以我的身份登录。

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

答案 1 :(得分:-5)

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

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