2010-04-23 6 views
26

Я пытаюсь получить данные с помощью нового API-диаграммы, однако токен, который я извлекаю из OAuth, кажется, не работает.Facebook graph API - OAuth Token

Звонок, который я делаю, выглядит следующим образом;

$token = file_get_contents('https://graph.facebook.com/oauth/access_token?type=client_cred&client_id=<app_id>&client_secret=<app secret>'); 

Это возвращает маркер с длиной строки из 41. Для того, чтобы дать вам пример того, что вернулся я предусмотрел ниже образца (преобразованный все числа 0, все заглавные буквы в «A» и маленький корпус письма к «а»

access_token=000000000000|AaaAaaAaaAAaAaaaaAaaAa0aaAA. 

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

file_get_contents('https://graph.facebook.com/<my_page's_id>/statuses?access_token=000000000000|AaaAaaAaaAAaAaaaaAaaAa0aaAA.') 

Когда я вручную извлекаю эту страницу непосредственно через браузер, я получаю сообщение об ошибке 500/Internal Server.

Любая помощь будет оценена по достоинству.


Update:

С тех пор я изменил метод с file_get_contents() свернуться. По возвращении заголовков я получаю следующее сообщение об ошибке ...

{"error":{"type":"OAuthException","message":"Missing client_id"}} 

но мой массив сообщений включает в себя «client_id» ?!

+0

привет сделал васвсе еще имеют ту же проблему –

ответ

24

Don't use type=client_cred, this is not the access token that a user grants for your app to use. You don't need redirect_uri or code or any approval to get the client_cred type access token.

Facebook implements an early draft of OAuth 2 at this time. So there is not support for "state" yet.

But it is nice that you can suffix your state to the redirect_uri, the important point to note here is that the site url that you specified (which is the redirect_uri)

не должны иметь

question mark at the end or anywhere in what you suffix as client state, encoded or not. If you did, you will get the dreaded "Error validating verification code"

Не использовать как этот

http://www.Redirect.com?

Correct Ссылка http://www.Redirect.com/

Надеюсь, это поможет.

+3

Это правильный ответ. Ваш redirect_uri должен заканчиваться на /. Спасибо, что сообщили нам! –

+0

Абсолютно точно 100%. Кроме того, в качестве комментария: НЕ ИСПОЛЬЗУЙТЕ redirect_uri в массиве $ params, заданном для метода getLoginUrl() на SDK PHP! Ты сломаешь его. –

+0

Даах! Отсутствует косая черта. Dang! – Spedge

0

Убедитесь, что URL закодированы ваши параметры запроса, ваш один должен быть на самом деле:

000000000000%7CAaaAaaAaaAAaAaaaaAaaAa0aaAA 

Примечание: также параметр типа, кажется, необходимо, без него вы также получите ошибку 500 с сообщением:

{ 
    "error": { 
    "type": "OAuthException", 
    "message": "Error validating verification code." 
    } 
} 

, а не сообщение, которое вы получаете с другими отсутствующими параметрами. Не вижу этого, упомянутого в the documentation.

+0

, в какой точке требуется параметр типа. он включен в $ token = file_get_contents (...) –

+0

О, извините, это записка для себя - у вас уже есть это в вашей части токена доступа – user242766

+1

Привет, я получаю следующую ошибку: { "error": { «type»: «OAuthException», «message»: «Отсутствует параметр redirect_uri». } } В чем может быть проблема с URL-адресом перенаправления? Я надеюсь, что все, что я дал, является правильным. –

2

Попробуйте следовать API, т.е. без type но добавить redirect_uri и code (даже если мы не нужны):

$token = file_get_contents('https://graph.facebook.com/oauth/access_token?client_id=<app_id>&client_secret=<app secret>&redirect_uri=<url>&code=<code>'); 
16

Это работает для меня :-)

header('Location: https://graph.facebook.com/oauth/access_token?' . http_build_query(array(
    'client_id'  => FB_APP_ID, 
    'type'   => 'client_cred', 
    'client_secret' => FB_SECRET, 
    'code'   => $code))); 

Конечно, вы бы использовали file_get_contents и проанализировали токен из ответа

+3

+1. Добавление типа = client_cred исправило это для меня. – harriyott

+1

+1 тип = client_cred работал для меня. Однако страница не перенаправляется на мою redirect_uri. – Richard

+0

type = client_cred, похоже, выдал вам токен без сеанса пользователя (как описано в разделе «Аутентификация как приложение»). Это по сути ведет себя так, как будто вы никогда не передавали код вообще. Токен без сеанса пользователя в основном работает, но некоторые API, которые должны знать, кто из нынешних пользователей не работает, в первую очередь: http://graph.facebook.com/me. Я полностью не смог получить токен с пользовательским сеансом, следуя инструкциям здесь или в facebook. Вид расстраивает. –

0

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

Connect URL: http://www.example.com/fb/connect/ 

Redirect URI: http://www.example.com/fb/connect/redirect 

я столкнулся с проблемой, где мое перенаправление URI было таким же, как соединять URL, но я забыл замыкающие/о перенаправлении URI так FB видел их как разные и провалил Авт.

-6

вам нужно ввести фактические значения вместо < app_id> и секретное значение. код является уникальным значением, которое необходимо создать, и URL-адрес перенаправления, который вы предоставите, будет проверять правильность кода.

+0

дорогой он на самом деле, может быть, не хочет показывать свое приложение здесь, вот почему он написал

3

Пожалуйста, обратите внимание, что

«типа» => «client_cred»,

только способ обойти ниже, сказав, что, выше также работает

После того как пользователь разрешает ваш приложение, мы перенаправляем пользователя обратно на URI перенаправления, который вы указали с помощью строки подтверждения в коде аргумента, которую можно обменять на токен доступа oauth. Замените его для токена доступа, извлекая https://graph.facebook.com/oauth/access_token. Пропустите точно же redirect_uri, как и в предыдущем шаге:

через: по: http://developers.facebook.com/docs/api Смотри также: http://forum.developers.facebook.net/viewtopic.php?pid=238371

+1

спасибо! Точная * то же redirect_uri помогла мне. :) –

6

Вы можете запросить маркер доступа с помощью терминала (OSX пользователей) с помощью завиток:

curl -F type=client_cred -F client_id=xxxxxxxxxxxxxxx -F client_secret=c0f88xxxxxxxxxxxxxxxxxx1b949d1b8 https://graph.facebook.com/oauth/access_token 

После того, как у вас есть маркер доступа, который вы можете использовать его в последующих запросах локон к вносит изменения через новый граф API:

отправить сообщение в профиле ID:

curl -F 'access_token=xxxxxxxxxxxxx|mGVx50lxxxxxxxxxxxxhzC2w.' -F 'message=Hello Likers' -F 'id=1250000000000905' https ://graph.facebook.com/feed 
+0

не истечет через токен доступа через несколько дней? –

+0

Привет, вулканический, я пытаюсь использовать эту технику для публикации в корму для любимой веб-страницы, если это работает, любые идеи? Http: // StackOverflow.com/questions/10419371/how-to-programatically-publish-to-a-facebook-feed-for-a-like-webpage –

8

Я столкнулся с одной и той же проблемой, но оказалось, что проблема заключается не в кодировании параметра redirect_uri, а в том, что у меня был завершающий слэш или вопросительный знак, просто я передал два разных URL-адреса перенаправления (не прочитал спецификация в то время).

Redirect_uri используется только как переадресация один раз (первый раз) для перенаправления обратно на полагающуюся сторону с помощью токена «код». Во второй раз redirect_uri передается обратно на сервер auth, но на этот раз он не используется, как вы ожидали (перенаправить), скорее, он используется сервером аутентификации для проверки кода. Сервер отвечает access_token.

http://tools.ietf.org/html/draft-ietf-oauth-v2-05#section-3.5.2

Вы заметите facebook документации (что ужасно) говорит принести «Обменять его на маркер доступа с помощью выборкиhttps://graph.facebook.com/oauth/access_token

В общем, у меня не было чтобы кодировать или делать что-либо особенное для Uri, просто перейдите в тот же redirect_uri дважды, и извлеките на 2-ю страницу, чтобы получить входной доступ внутри.

0

Извините за размещение в старом вопросе. Из-за изменений в последнем доступе fb. У меня этот код работает и думал, что я отправлю сообщение кому-либо, кому нужна помощь. Этот метод отлично работает с jQuery ajax и исключает приведенный пример redirect_uri из facebook.

$ch = curl_init("https://graph.facebook.com/oauth/access_token?client_id=INSERT_YOUR_APP_ID_HERE&client_secret=INSERT_YOUR_APP_SECRET_HERE&grant_type=client_credentials"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_NOSIGNAL, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 30000); 
$data = curl_exec($ch); 
$curl_errno = curl_errno($ch); 
$curl_error = curl_error($ch); 
curl_close($ch); 

if ($curl_errno > 0) 
{ 
     echo "cURL Error ($curl_errno): $curl_error\n"; 
} 
else 
{ 
    echo $data; 
} 

выводит общедоступный доступ к доступу для просмотра пользователям, не являющимся пользователями. например, на странице facebook, через страницу api для веб-сайтов. access_token = 191648007534048 | eVilnMh585rlQLZLvBAmqM6s-1g

2

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

Первый мы должны создать экземпляр нашего приложения.

$facebook = new Facebook(array(
    'appId' => '149865361795547', 
    'secret' => 'ee827a8df6202e1857b3fc28f3185a61', 
    'cookie' => true, 
)); 

простой способ получить access_token

$token = $facebook->getAccessToken(); 

статус получить страницу, как вы спросите в вашем вопросе

$response = $facebook->api($pageID . '/feed','get',$token); 

спасибо ..

Смежные вопросы