Преобразование сеансовых ключей Facebook к маркерам доступа

У меня есть веб-приложение, которое позволяет пользователям соединять аккаунт в 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 полномочия). Это корректно?

Обновление:

Ниже точные шаги, которые я сделал для преобразования сеансового ключа в маркер доступа, наряду с выводом, который я получил. Надо надеяться, это поможет обнаружить мою проблему.

Шаг 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.',
  )),
))

7
задан Alex Grin 19 July 2013 в 15:23
поделиться

2 ответа

В руководстве по обновлению платформы есть раздел о OAuth 2.0, который включает инструкции по обмену session_key ] для access_token . Вы должны использовать это, если вы уже сохранили ключи сеанса.

Новым пользователям следует использовать один из новых пакетов SDK или поток OAuth2 напрямую, который для начала предоставит вам токен доступа.

-5
ответ дан 8 December 2019 в 01:59
поделиться

Из прочтения вашего сообщения я понял -

Вы преобразовываете ключи сеанса в ключи доступа для каждого пользователя в вашей системе и сохраняете эти ключи.

Затем вы проверяете ключ на своей собственной странице. (Graph.facebook.com/me и т. Д.)

В этом случае

A) Вы не можете использовать ключ другого пользователя с вашим собственным ключом. Переход на graph.facebook.com будет действителен только для пользователя, которому принадлежит ключ, и если он вошел в систему. Так, например, если у вас есть мой ключ доступа, вы можете посетить http: //graph.facebook. com / YOURID ... .), но для работы graph.facebook.com/me вам нужно будет войти в систему как я.

B) Срок действия этих ключей истекает каждые 3 часа (или около того), поэтому он может быть недействительным.

1
ответ дан 8 December 2019 в 01:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: