web-dev-qa-db-fra.com

API graphique Facebook - OAuth Token

J'essaie de récupérer des données à l'aide de la nouvelle API graphique, mais le jeton dont je récupère OAuth ne semble pas fonctionner.

L'appel que je fais est le suivant;

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

Cela renvoie un jeton avec une longueur de chaîne de 41. Pour vous donner un exemple de ce qui est retourné, j'ai fourni ci-dessous un échantillon (converti tous les nombres en 0, toutes les lettres majuscules en 'A' et les minuscules en 'a'

access_token=000000000000|AaaAaaAaaAAaAaaaaAaaAa0aaAA.

Je prends ce jeton d'accès et je le joins à la demande d'appel de données, il ne semble pas être le bon jeton car il ne renvoie rien. J'effectue l'appel de données comme suit;

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

Lorsque je récupère manuellement cette page directement via le navigateur, j'obtiens un message d'erreur 500/Internal Server.

Toute aide serait grandement appréciée.


Mise à jour:

J'ai depuis changé la méthode de file_get_contents () en curl. En récupérant les en-têtes, j'obtiens le message d'erreur suivant ...

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

mais mon tableau de publication comprend 'client_id'?!

26
Simon R

N'utilisez pas type = client_cred, ce n'est pas le jeton d'accès qu'un utilisateur accorde à votre application. Vous n'avez pas besoin de redirect_uri ou de code ou d'une approbation pour obtenir le jeton d'accès de type client_cred.

Facebook implémente une version préliminaire de OAuth 2 pour le moment. Il n'y a donc pas encore de support pour "état".

Mais c'est bien que vous puissiez suffixer votre état au redirect_uri, le point important à noter ici est que l'url du site que vous avez spécifié (qui est le redirect_uri)

ne devrait pas avoir

point d'interrogation à la fin ou n'importe où dans ce que vous suffixez comme état client, codé ou non. Si vous l'avez fait, vous obtiendrez le redouté "Erreur de validation du code de vérification"

Ne pas utiliser comme ça

http://www.Redirect.com?

L'URL correcte est http://www.Redirect.com/

J'espère que cela aide.

24
PrateekSaluja

Cela fonctionne pour moi :-)

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)));

Bien sûr, vous utiliserez plutôt file_get_contents et analyserez le jeton de la réponse

16
phpslacker

J'ai rencontré exactement le même problème, mais il s'est avéré que le problème n'est pas le codage du paramètre redirect_uri, ou que j'avais une barre oblique ou un point d'interrogation, c'est simplement que j'ai transmis deux URL de redirection différentes (je n'avais pas lu les spécifications à ce moment-là). temps).

Le redirect_uri n'est utilisé comme redirection qu'une seule fois (la première fois) pour rediriger vers la partie de confiance avec le jeton "code". La 2e fois, le redirect_uri est retransmis au serveur d'authentification mais cette fois, il n'est pas utilisé comme prévu (pour rediriger), mais plutôt utilisé par le serveur d'authentification pour vérifier le code. Le serveur répond avec le access_token.

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

Vous remarquerez que la documentation Facebook (ce qui est terrible) dit fetch "Échangez-le contre un jeton d'accès par fetching https://graph.facebook.com/oauth/access_token . "

En résumé, je n'ai pas eu à encoder ou à faire quoi que ce soit de spécial à l'Uri, il suffit de passer deux fois le même redirect_uri et d'aller chercher la 2ème page à obtenez le access_token à l'intérieur.

8
Francis Shanahan

Vous pouvez demander un jeton d'accès via un terminal (utilisateurs OSX) en utilisant curl:

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

Une fois que vous avez votre jeton d'accès, vous pouvez ensuite l'utiliser dans de futures demandes de curl pour effectuer des modifications via la nouvelle API graphique:

Publier un message sur un identifiant de profil:

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

Veuillez noter que

'type' => 'client_cred',

n'est qu'un moyen de contourner ce qui suit, cela dit, cela fonctionne également

Une fois que l'utilisateur a autorisé votre application, nous le redirigeons vers l'URI de redirection que vous avez spécifié avec une chaîne de vérification dans le code d'argument, qui peut être échangée contre un jeton d'accès oauth. Échangez-le contre un jeton d'accès en récupérant https://graph.facebook.com/oauth/access_token . Passez le exact même redirect_uri que dans l'étape précédente:

via: par: http://developers.facebook.com/docs/api voir aussi: http://forum.developers.facebook.net/viewtopic.php?pid=238371

3
Martin

Peut-être que votre problème est résolu mais je n'ai pas encore trouvé de réponse acceptée de votre part et peut-être que cette réponse aide ceux qui font face à un problème similaire

Nous devons d'abord créer notre instance d'application.

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

moyen facile d'obtenir access_token

$token = $facebook->getAccessToken();

obtenir l'état de la page comme vous le demandez dans votre question

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

merci ..

2
Danish Iqbal

Essayez de suivre l'API, c'est-à-dire sans type mais ajoutez redirect_uri et code (même si nous n'en avons pas besoin):

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

Désolé de poster dans une ancienne question. En raison de changements dans l'accès fb récent. J'ai ce code qui fonctionne et j'ai pensé que je publierais pour toute autre personne ayant besoin d'aide. Cette méthode fonctionne très bien avec jQuery ajax et élimine l'exemple donné de redirect_uri de 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;
}

affiche un access_token accessible au public à afficher aux utilisateurs non facebook. c'est-à-dire un mur de flux de page facebook via une interface graphique pour les sites Web. access_token = 191648007534048 | eVilnMh585rlQLZLvBAmqM6s-1g

phpfacebookoauth2facebook-accesstokenfacebook-oauth

0
Damien Keitel

Assurez-vous que vous avez encodé l'URL de vos paramètres de requête, celui-ci devrait en fait être:

000000000000%7CAaaAaaAaaAAaAaaaaAaaAa0aaAA

Remarque: le paramètre type semble également être requis, sans cela, vous obtenez également une erreur de 500 avec un message:

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

plutôt que le message que vous obtenez avec d'autres paramètres manquants. Impossible de voir celui mentionné dans la documentation .

0
user242766

Vous pouvez également obtenir cette erreur si votre URL de connexion n'est pas une base de votre URI de redirection. Par exemple

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

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

J'ai rencontré un problème où mon URI de redirection était le même que l'URL de connexion, mais j'ai oublié l'URL de fin/sur l'URI de redirection, alors FB les a vus comme différents et a échoué l'authentification.

0
Jeremy Raymond