web-dev-qa-db-fra.com

Impossible d'obtenir le jeton d'accès de Facebook. Vous avez une exception OAuthException indiquant "Erreur de validation du code de vérification"

J'utilise Java et le but de mon application de démonstration est simple: mettre à jour le statut d'utilisateur . J'ai suivi le flux côté serveur à la page http://developers.facebook.com/docs/authentication . J'ai eu le dialogue d'authentification, facebook mène à l'URL de rappel et j'ai le code dans ma page de rappel. Ensuite, j'ai échoué lorsque j'essayais de générer un jeton d'accès. 

Dans la page du guide, il est indiqué que l'URL suivante peut être utilisée pour générer un jeton d'accès:

https://graph.facebook.com/oauth/access_token?
     client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&
     client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE

Mais ce qui se passe dans mon environnement, c’est le message d’erreur suivant:

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

Je suis à peu près sûr que chaque paramètre est correct, car si je change la valeur client_id ou le paramètre client_secret, un message d'erreur différent apparaît. Le paramètre de code est ce que j'ai reçu de facebook callback. Donc, cela devrait être correct, non? Vraiment ne peut pas comprendre quel est le problème ....

Une idée à ce sujet? Je suis coincé ici ...

43
DeepNightTwo

J'ai récemment traité exactement ce problème: tout correspondait, mais cela a échoué avec l'exception OAuthException. La chose qui a fait le travail était de changer la redirection uri (dans les deux demandes de flux) de:

http://foo.example.com

à

http://foo.example.com/

C'est-à-dire, ajoutez la barre oblique finale. Et puis ça a marché. Stupide et idiot, mais voilà.

63
Chip

J'ai eu le même problème et essayé les suggestions ci-dessus. Ils ont aidé, mais dans mon cas, le problème était que mon URL redir avait un paramètre de requête et que Facebook n'était pas cool avec ça. Ainsi, la morale de l'histoire est que l'URL de redir que vous avez envoyé pour échanger le jeton doit être identique à l'URL de redir d'origine et qu'il ne peut pas avoir de paramètres de requête.

6
Vinayak Suley

J'ai eu le même problème. C'était une différence d'URL, mais contrairement aux autres qui ont posté, le mien était la différence entre HTTP et HTTPS.

BigIP gère les demandes HTTPS et les transfère vers un serveur HTTP Apache. Lorsque la fonction getCurrentUrl () de BaseFacebook a été appelée, elle détecte HTTP et non le protocole HTTPS d'origine. J'ai modifié cette fonction comme suit:

protected function getCurrentUrl() {
    if ((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on' || $_SERVER['HTTPS'] == 1)) ||
        (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') || 
        (isset($_SERVER['HTTP_PSEUDOSSL']) && $_SERVER['HTTP_PSEUDOSSL'] == 'true')) {
      $protocol = 'https://';
    }
    else {
      $protocol = 'http://';
    }
...

Cette version supporte la clé HTTP_PSEUDOSSL. J'espère que ça aidera quelqu'un.

3
Brad

Nous nous sommes aussi bien amusés avec cela. 

Dans notre cas, la barre oblique de fin dans l'URL était déjà présente. J'ai donc essayé le jeton que nous utilisions dans FB Debug Tool et il a été validé. Il semblait donc que FB ne voyait même pas le jeton dans la demande.

Après quelques recherches, j'ai trouvé le casse-tête - nous effectuons une opération GET avec des en-têtes HTTP, mais pas avec une chaîne de chaînes de Querystring. FB ne voyait donc pas du tout le Token.

La morale semble être que si vous pouvez valider le jeton dans l'outil de débogage FB, il y a probablement/quelque chose/qui ne va pas dans votre demande - 

Il peut s'agir d'un "/" manquant ou d'une autre incompatibilité avec l'URL définie de l'application (Domain Mistmatch est une erreur différente). Je n'ai pas essayé de définir l'URL de l'application/Web pour HTTPS et de faire la demande avec HTTP, mais je soupçonne que ce serait aussi le hiccup.

Ou, comme dans notre cas, la méthode de requête peut être incorrecte - GET avec en-têtes ou POST tous les deux jettent le 2500, vous devez faire GET avec une chaîne de chaîne de caractères.

J'espère que cela pourra aider!

3
Serexx

Oui, le slash final a fonctionné pour moi aussi, merci!

Pour des raisons de débogage, j’ai trouvé utile d’utiliser exactement le code fourni par fb sur la page des développeurs:

http://developers.facebook.com/docs/authentication/

Une fois que cela fonctionne, vous pouvez le modifier pour l'adapter à votre propre code.

Je ne suis pas sûr, mais vous pouvez également vérifier que les paramètres "URL du site" et "Domaine du site" sont corrects sur l'écran Modification de l'application car, selon la documentation, redirect_uri doit appartenir au même domaine. (Ceci est différent des URL de canvas/onglet.)

2
matt

J'avais aussi un problème d'URL, mais la solution est différente. Je passais le signedRequest que le SDK JavaScript retourne au serveur, et j'utilise la valeur code de celui-ci pour demander un jeton d'accès. Toutefois, selon certains commentaires de la version 3.1.1 du SDK PHP Facebook , le SDK JavaScript associe la code à un redirect_uri de chaîne vide, c'est-à-dire "":

// the JS SDK puts a code in with the redirect_uri of ''
if (array_key_exists('code', $signed_request)) {
    $code = $signed_request['code'];
    $access_token = $this->getAccessTokenFromCode($code, '');
    if ($access_token) {
       // etc
    }
}

Après avoir modifié mon propre code côté serveur pour utiliser un redirect_uri sur "", la demande de jeton d'accès a fonctionné.

0
user456814

dans mon cas, mon code ne fonctionnait pas sur IE . Le problème se trouvait dans la ligne suivante 

$user_id = $facebook->getUser();
if ($user_id)

Parce que d'une certaine manière, la fonction getUser renvoyait toujours 0, cette condition était donc toujours vraie. Puis il a généré cette erreur à partir d'un jeton invalide ... Bon, je l'ai corrigé en disant simplement ceci:

if ($user_id>0)

Chose futile...

0
Diogo Mendonça