web-dev-qa-db-fra.com

Facebook access_token invalide?

J'essaie d'utiliser la nouvelle API graphique Facebook récemment publiée, mais je n'arrive pas à la faire fonctionner correctement.

J'ai parcouru les étapes et après l'appel/authorize, je reçois un code d'accès:

access_token=109002049121898|nhKwSTJVPbUZ5JYyIH3opCBQMf8.

Lorsque j'essaie d'utiliser ce jeton, je reçois:

{
   "error": {
      "type": "QueryParseException",
      "message": "An active access token must be used to query information about the current user."
   }
}

Je suis perplexe car aussi pourquoi ...

-AC

13
Alex Cook

même chose ici. J'ai suivi blog de Ben Biddington pour obtenir le jeton d'accès. Même erreur en essayant de l'utiliser. L'implémentation OAuth de Facebook ne suit pas complètement les spécifications, cela me convient tant que la doc est claire, ce qui n'est évidemment pas le cas ici. De plus, ce serait bien si l'ID utilisateur et le nom d'utilisateur sont retournés avec le jeton d'accès.

7
JiJ

Lors de l'utilisation du jeton de votre application Facebook

Si vous utilisez l'alias me comme dans https://graph.facebook.com/me/ mais que votre jeton est acquis pour un Application Facebook , "moi" n'est plus votre nom - c'est l'application ou peut-être rien. Quoi qu'il en soit, ce n'est pas votre intention que l'application interagisse avec elle-même. 

Dans ce cas, vous souhaiterez interagir avec votre compte d'utilisateur personnel à partir d'une application. Ce que vous devez faire (après avoir donné à l'application les autorisations demandées dans l'interface utilisateur quand elle le demande) est de trouver votre identifiant facebook # et de le mettre à la place de "moi" pour accéder à vos propres informations. par exemple. L'utilisateur Facebook de Mark Zuckerberg est 4, il est donc https://graph.facebook.com/4/

L'alias me ne fonctionne que si vous êtes vous! Il est parfois difficile de se rappeler qui est l'utilisateur actuel lors de la programmation de facebook (c'est-à-dire vous, la page, l'application, etc.) car nous sommes habitués à utiliser l'interface utilisateur de Facebook comme la plupart du temps. Du point de vue de la programmation, cela dépend de ce que représente le jeton acquis. 

Un bon article de blog qui m'aide toujours à me corriger est Ben Biddington | Facebook Graph API - Obtenir des jetons d'accès .

12
John K

Juste pour clarifier - après avoir appelé

https://graph.facebook.com/oauth/authorize?

vous devriez recevoir un CODE qui, associé à votre CLIENT_ID et à CLIENT_SECRET (en supposant que vous ayez enregistré votre application), peut être échangé contre un access_token à l'adresse

https://graph.facebook.com/oauth/access_token?

Si c’est bien ainsi que vous en êtes parvenu avec votre ACCESS_TOKEN, vous devriez alors pouvoir demander 

https://graph.facebook.com/me/
4
Bosh

L'ajout du paramètre type renvoie le paramètre auth_token au niveau de l'application. Il est donc préférable de l'OMITER. Ce qui a fonctionné pour moi, après d'innombrables tentatives et combinaisons, est d'utiliser le même paramètre redirect_url dans l'appel à /oath/access_token que celui utilisé dans l'appel à /oath/authorize.
La séquence complète pour autoriser votre application au nom de quelqu'un est la suivante:

1. appelez ou redirigez vers:

"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. dans la page située au return_url ci-dessus, émettez une demande ou quoi que ce soit d'autre à cette 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"
2
Fil

J'avais le même problème dans IE8 uniquement. La solution pour moi consistait à envoyer le paramètre access_token dans la demande d'API. Quelque chose comme ceci:

FB.api('/me/friends?access_token=<YOUR TOKEN>

J'ai obtenu mon token via PHP comme ceci:

// Create our Application instance.
$facebook = new Facebook(array(
    'appId'  => '<API_ID>',
    'secret' => '<SECRET>',
    'cookie' => false,
));

$session = $facebook->getSession();
$token = $session['access_token'];
1
Alberto Miranda

En fait, j'ai remarqué que si votre retour ne comportait pas de barre oblique, vous avez des problèmes. Je teste actuellement dans le navigateur et return_uri = https: //mondomaine.com ne fonctionne pas mais return_uri = https: //mydomain.com/ fonctionne. Si j'utilise le premier, j'obtiens "Erreur de validation du code de vérification".

Cela semble un peu étrange, mais je viens de rater un mot dans les spécifications/instructions. A perdu deux heures de ma vie à cela cependant.

0
Grummle

J'ai eu exactement le même problème. Quelques choses que j'ai faites pour le résoudre:

  1. Essayez tout d'abord dans le navigateur pour vous assurer que les URL sont correctes à chaque étape.
  2. Assurez-vous que l'URL de redirection est identique et pas seulement équivalente. Paramètres dans le même ordre, codant le même
  3. N'utilisez pas le type = client_cred, ou quoi que ce soit d'autre
  4. Encodez tous les esperluettes dans le redirect_url (mais pas le reste de l'URL) par ex. http://example.com/fb?foo=234%26bar=567 . Celui-ci m'a causé le plus de problèmes. Lorsque la page de rappel a été exécutée, seule l'URL précédant la première perluète était incluse, cette dernière étant supposée faire partie de l'URL de graph.facebook.com, not de la redirection_url. J'obtenais alors les valeurs de la chaîne de requête à mettre dans le redirect_url pour le deuxième appel, mais elles n'étaient pas là. Une fois que j'ai encodé les esperluettes, elles sont apparues correctement.
  5. N'ayez aucune valeur vide dans vos paramètres de chaîne de requête codés (par exemple?? Foo =% 26bar = 123)
0
harriyott

Je tiens à souligner ce qui a été dit en quelque sorte sur le blog de Ben Biddington et ce que j’ai remarqué en regardant access_token "malformé" dans la question initiale. D'autres ont dit des choses similaires dans ce fil, mais je veux être explicite.

Le jeton n'est pas réellement mal formé, mais plutôt un jeton qui vous permet d'effectuer des actions pour le compte de l'application, pas pour l'utilisateur. C'est le jeton que vous utiliseriez si vous vouliez obtenir tous les utilisateurs de l'application, ou afficher des informations sur votre application, etc., avec les demandes provenant généralement de votre serveur, pas du client. Ce type de jeton est obtenu en utilisant le paramètre type = client_cred. Si vous souhaitez effectuer des tâches pour le compte de l'utilisateur, ne spécifiez pas type = client_cred et veillez à spécifier les paramètres suivants lors de votre appel à http://graph.facebook.com/oauth/access_token :

'client_id' => APP_ID
'redirect_uri' => REDIRECT_URI
'client_secret' => APP_SECRET
'code' => $_GET['code']

J'ai écrit ceci sous la forme de paires clé-valeur d'un tableau PHP, mais je pense que vous comprenez bien. La valeur de code GET est obtenue après l'appel initial à http://graph.facebook.com/oauth/authorize avec les paramètres suivants:

'client_id' => APP_ID
'redirect_uri' => "http://your.connect.url/some/endpoint"

J'espère que ça aide! Ce que disent les documents Facebook, mais ne dites pas bien, c'est que l'obtention d'un access_token est un processus à deux demandes.

0
Andrew

J'ai eu le même problème, mais me débarrasser de type=client_cred et m'assurer que le paramètre redirect_uri est le même lors de la création de l'autorisation et que le access_token call a résolu le problème.

0
Sergi Mansilla