【发布时间】: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.',
)),
))
【问题讨论】: