У меня есть веб-приложение, которое позволяет пользователям соединять аккаунт в Facebook со своей учетной записью на моем сайте. Когда пользователь решает соединиться с Facebook, запросами приложения publish_stream
и offline_access
полномочия, и затем хранят Facebook uid
и session_key
для каждого пользователя. Все это хорошо работает прямо сейчас.
Моя проблема мигрирует на новую систему OAuth 2.0 Facebook. Я хотел бы преобразовать сеансовые ключи, которые я имею в маркеры доступа. Я следовал этим инструкциям, и все, казалось, хорошо работало; Facebook возвратил набор маркеров доступа. Однако ни один из них не работает. Когда я пытаюсь перейти к URL, такому как https://graph.facebook.com/me? access_token=TOKEN-HERE, я получаю ошибку, которая говорит "Ошибку при проверке клиента".
Что я делаю неправильно?
Кроме того, у меня создается впечатление, что работа маркеров доступа точно так же, как сеансовые ключи в этом, после того как я имею один, я могу использовать ее навсегда (так как я запрашиваю offline_access
полномочия). Это корректно?
Ниже точные шаги, которые я сделал для преобразования сеансового ключа в маркер доступа, наряду с выводом, который я получил. Надо надеяться, это поможет обнаружить мою проблему.
Код:
$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.',
)),
)
Код:
$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.',
)),
))
В руководстве по обновлению платформы есть раздел о OAuth 2.0, который включает инструкции по обмену session_key
] для access_token
. Вы должны использовать это, если вы уже сохранили ключи сеанса.
Новым пользователям следует использовать один из новых пакетов SDK или поток OAuth2 напрямую, который для начала предоставит вам токен доступа.
Из прочтения вашего сообщения я понял -
Вы преобразовываете ключи сеанса в ключи доступа для каждого пользователя в вашей системе и сохраняете эти ключи.
Затем вы проверяете ключ на своей собственной странице. (Graph.facebook.com/me и т. Д.)
В этом случае
A) Вы не можете использовать ключ другого пользователя с вашим собственным ключом. Переход на graph.facebook.com будет действителен только для пользователя, которому принадлежит ключ, и если он вошел в систему. Так, например, если у вас есть мой ключ доступа, вы можете посетить http: //graph.facebook. com / YOURID ... .), но для работы graph.facebook.com/me вам нужно будет войти в систему как я.
B) Срок действия этих ключей истекает каждые 3 часа (или около того), поэтому он может быть недействительным.