Использование Facebook Graph API с JS SDK на странице холста iFrame в Safari не работает - PullRequest
5 голосов
/ 01 февраля 2011

Поэтому я пытаюсь использовать Graph API с Facebook JS SDK и получаю следующую ошибку в Safari:

"OAuthException: активный токен доступа должен использоваться для запроса информации отекущий пользователь. "

Я подозревал, что это связано с тем, что Safari очень строг с настройкой файлов cookie для x-домена, и поэтому я попробовал это в Firefox с параметром cookie, установленным в false в FB.init().Я действительно обнаружил, что получаю ту же ошибку для моих FB.api() запросов.

FB.init({
  appId:  "<%= app_id %>",
  status: true, // check login status
  // We cannot rely on this cookie being set in an iframe. I found this
  // out because the Graph API was not working in Safari.
  // cookie: true, // enable cookies to allow the server to access the session
  xfbml:  true, // parse XFBML
  channelUrl: window.location.protocol + '//' + window.location.host + '/fb/canvas/channel.html'
});

Так что мне интересно ... Есть ли хороший способ вручную установить параметр запроса access_token вFB.api() запрос?

Если файл cookie FB.init() настроен правильно, то параметры запроса FB.api() выглядят следующим образом:

access_token  xxxxxxxxxxxx|1.xxxxxxxxxxxxxxxxxxxxxx__.3600.xxxxxxxxxx-xxx|xxxxxxxxxxxxxxxxxxxxxxxxxxx
callback      FB.ApiServer._callbacks.xxxxxxxxxxxxxxx
pretty        0
sdk           joey

в Safari (или когда cookie FB.init() опция не установлена) параметры запроса FB.api() выглядят так:

callback      FB.ApiServer._callbacks.xxxxxxxxxxxxxxx
pretty        0
sdk           joey

Теперь ... очевидно, мое приложение имеет возможность генерировать access_token на стороне сервера ...Мне интересно, есть ли способ вручную установить FB.api() для использования сгенерированного на сервере access_token.

Ответы [ 2 ]

4 голосов
/ 01 февраля 2011

Хорошо, я получил его на работу.Оказывается, вам не нужен параметр FB.init() cookie: true для использования FB.api() - вы можете вручную передать access_token:

FB.api("/me/apprequests/?access_token="+access_token, function (response) {});

Где access_token - это переменная JSвы устанавливаете серверную сторону при загрузке страницы.Вот пример ERB:

<script>
  var access_token = "<%= @access_token %>";
</script>

И @access_token - это oauth access_token, который передается на вашу страницу холста в начальном запросе POST.

3 голосов
/ 01 февраля 2011

Ограничение Safari заключается в том, что он не позволяет содержимому iframe создавать или использовать файлы cookie, если домен отличается от родительского ... если пользователь сначала не взаимодействует с ним.Эта проблема уникальна для Safari, а не для webkit, поэтому с Chrome все в порядке.

После того, как я сам столкнулся с этой проблемой (несколько болезненных раз), есть решение, которое кажется хорошим решением.Техника заключается в том, чтобы внедрить форму в тело страницы с помощью javascript, а затем вызвать событие submit.Safari принимает это как взаимодействие с пользователем и разрешает использование файлов cookie.

Хороший пример можно найти на форуме разработчиков Facebook здесь

...