Facebook неверный токен доступа?
Я пытаюсь использовать недавно выпущенный API Graph Graph Facebook, но не могу заставить его работать правильно.
Я прошел через шаги, и после вызова /authorize я получаю access_token:
access_token=109002049121898|nhKwSTJVPbUZ5JYyIH3opCBQMf8.
Когда я пытаюсь использовать этот токен, я получаю:
{
"error": {
"type": "QueryParseException",
"message": "An active access token must be used to query information about the current user."
}
}
Я в тупике, как и почему...
-AC
9 ответов
То же самое здесь. Я проследил за блогом Бена Биддингтона, чтобы получить токен доступа. Та же ошибка при попытке использовать его. Реализация OAuth в Facebook не полностью соответствует спецификации, с ней все в порядке, пока документ ясен, что, очевидно, здесь не так. Также было бы неплохо, если бы ID пользователя и имя пользователя возвращались с токеном доступа.
При использовании токена вашего приложения Facebook
Если вы используете me
псевдоним как в https://graph.facebook.com/me/
но ваш токен приобретен для приложения Facebook, тогда "я" больше не вы - это приложение или, может быть, ничего. В любом случае, вы не намерены взаимодействовать с самим приложением.
В этом случае вы захотите взаимодействовать с вашей личной учетной записью пользователя из приложения. Что вам нужно сделать (после предоставления приложению разрешений, которые оно запрашивает в пользовательском интерфейсе при запросе), найти свой идентификатор пользователя в Facebook и поставить его вместо "я", чтобы получить доступ к вашей собственной информации. например, идентификатор пользователя Марк Цукерберг на Facebook равен 4, поэтому он https://graph.facebook.com/4/
Псевдоним me
работает только если ты ты! Иногда трудно вспомнить, кто является текущим пользователем при программировании Facebook (т. Е. Вы, страница, приложение и т. Д.), Потому что мы привыкли использовать пользовательский интерфейс facebook большую часть времени сами. С точки зрения программирования это зависит от того, что представляет полученный токен.
Отличный пост в блоге, который всегда помогает мне поправиться, - Бен Биддингтон | Facebook Graph API - получение токенов доступа.
Просто чтобы уточнить - после звонка
https://graph.facebook.com/oauth/authorize?
Вы должны получить CODE, который вместе с вашими CLIENT_ID и CLIENT_SECRET (при условии, что вы зарегистрировали свое приложение) можно обменять на access_token по адресу
https://graph.facebook.com/oauth/access_token?
Если это действительно так, как вы пришли от ACCESS_TOKEN, вы сможете запросить
https://graph.facebook.com/me/
Добавление параметра type возвращает auth_token для уровня приложения, поэтому лучше его пропустить. То, что сработало для меня, после бесчисленных попыток и комбинаций, использует то же самое redirect_url
параметр в вызове /oath/access_token
как было использовано в звонке /oath/authorize
,
Таким образом, полная последовательность действий для авторизации вашего приложения от чьего-либо имени:
1. позвонить или перенаправить на:
"https://graph.facebook.com/oauth/authorize?client_id=" + my_clientId + "&scope=publish_stream,offline_access,manage_pages" + "&redirect_uri=" + "http://my_redirect_url?blah"
2. на странице, расположенной на return_url
выше, отправьте запрос или что-нибудь еще на этот URL:
"https://graph.facebook.com/oauth/access_token?client_id=" + client_id + "&client_secret=" + secret + "&code=" + Request.QueryString["code"] + "&redirect_uri=" + "http://my_redirect_url?blah"
У меня была такая же проблема только в IE8. Решением для меня была отправка access_token в запросе API. Что-то вроде этого:
FB.api('/me/friends?access_token=<YOUR TOKEN>
Я получил свой токен через PHP следующим образом:
// Create our Application instance.
$facebook = new Facebook(array(
'appId' => '<API_ID>',
'secret' => '<SECRET>',
'cookie' => false,
));
$session = $facebook->getSession();
$token = $session['access_token'];
У меня точно такая же проблема. Несколько вещей, которые я сделал, чтобы решить это:
- Сначала попробуйте все это в браузере, чтобы убедиться, что URL-адреса правильны на каждом этапе.
- Убедитесь, что URL перенаправления идентичен, а не просто эквивалентен. Параметры в том же порядке, кодирующие то же
- Не используйте type = client_cred или что-либо еще в этом отношении
- Закодируйте любые амперсанды в redirect_url (но не в остальной части URL), например, http://example.com/fb?foo=234%26bar=567. Этот вызвал у меня больше всего проблем. Когда запускалась страница обратного вызова, включался только URL-адрес перед первым амперсандом, поскольку предполагалось, что амперсанд является частью URL-адреса для graph.facebook.com, а не частью redirect_url. Затем я получал значения из строки запроса, чтобы поместить их в redirect_url для второго вызова, но их там не было. Как только я закодировал амперсанды, они появились правильно.
- Не используйте пустые значения в закодированных вами параметрах строки запроса (например,? Foo=%26bar=123)
Я на самом деле заметил, что если у вашего возвращения Ури нет косой черты, у вас есть проблемы. В настоящее время я тестирую в браузере и return_uri = https: //mydomain.com не работает, но return_uri = https: //mydomain.com/ работает. Если я использую первый, я получаю "Ошибка проверки кода подтверждения".
Это кажется немного странным, но я просто пропустил слово в спецификации / инструкции где-то. Потерял два часа моей жизни к этому все же.
Я хочу указать на то, что было сказано в блоге Бена Биддингтона, и что я заметил, посмотрев на "искаженный" access_token в первом вопросе. Другие говорили подобные вещи в этой теме, но я хочу быть явным.
Токен на самом деле не деформирован, а скорее токен, который позволяет вам выполнять действия от имени приложения, а не от пользователя. Это маркер, который вы будете использовать, если хотите получить информацию обо всех пользователях приложения или просмотреть информацию о вашем приложении и т. Д., Причем запросы обычно поступают с вашего сервера, а не с клиента. Этот тип токена получается с помощью параметра type=client_cred. Если вы хотите что-то делать от имени пользователя, не указывайте type=client_cred и убедитесь, что вы указали следующие параметры при вызове http://graph.facebook.com/oauth/access_token:
'client_id' => APP_ID
'redirect_uri' => REDIRECT_URI
'client_secret' => APP_SECRET
'code' => $_GET['code']
Я написал это как пары ключ-значение массива PHP, но я думаю, вы поняли. Значение GET кода получается после первоначального вызова http://graph.facebook.com/oauth/authorize со следующими параметрами:
'client_id' => APP_ID
'redirect_uri' => "http://your.connect.url/some/endpoint"
Надеюсь, это поможет! Документы Facebook говорят, но плохо говорят, что получение access_token - это процесс с двумя запросами.
У меня была такая же проблема, но избавиться от type=client_cred
и убедитесь, что параметр redirect_uri одинаков при выполнении авторизации и access_token call
исправил проблему.