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

Ale*_*rin 7 facebook oauth

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

我的问题是迁移到Facebook的新OAuth 2.0系统.我想将我拥有的会话密钥转换为访问令牌.我遵循这些指示,一切似乎都很好; 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));
Run Code Online (Sandbox Code Playgroud)

输出:

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

第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));
Run Code Online (Sandbox Code Playgroud)

输出:

stdClass::__set_state(array(
   'error' => 
  stdClass::__set_state(array(
     'type' => 'OAuthException',
     'message' => 'Error validating client.',
  )),
))
Run Code Online (Sandbox Code Playgroud)

daa*_*aku -5

平台升级指南中有一个关于 OAuth 2.0 的部分,其中包括session_keyaccess_token. 如果您已经存储了会话密钥,则应该使用它。

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