web-dev-qa-db-fra.com

Erreur facebook «Erreur de validation du code de vérification»

erreur très étrange. j'utilise gide http://developers.facebook.com/docs/authentication/ . donc je crée une demande pour fb et passe redirect_uri. j'utilise le site de test sur localhost. donc si je passe

redirect_uri = http: //localhost/test_blog/index.php

ça marche bien, mais si je passe

redirect_uri = http: //localhost/test_blog/index.php? r = site/oauth2

il ne veut pas de travail. j'essaye d'utiliser

redirect_uri =. urlencode (' http: //localhost/test_blog/index.php? r = site/oauth2 )

mais pas de travail. j'essaye d'expliquer. je réussis à obtenir du code, mais lorsque j'accède https://graph.facebook.com/me?access_token j'obtiens l'erreur "Erreur de validation du code de vérification". j'ai vérifié tous les jours, l'erreur est dans ? r = site/oauth2 mais j'ai besoin de passer quelques paramètres quelqu'un peut-il m'aider? j'ai lu le post http://forum.developers.facebook.net/viewtopic.php?id=70855 mais rien ne fonctionne pour moi

54
kusanagi

Il existe actuellement (en mars 2011) des exigences non documentées concernant ce qui fait un redirect_uri valide.

Tout d'abord, les deux paramètres redirect_uri à autoriser et access_token doivent correspondre.

Apparemment, Facebook (ou plutôt OAuth2) utilise le redirect_uri comme clé interne pour coder le code renvoyé pour la demande access_token. C'est un peu intelligent car il revient sur votre site. Il explique pourquoi la requête access_token qui n'aurait autrement pas besoin d'un paramètre redirect_uri en requiert un.

Deuxièmement, vous ne pouvez pas utiliser beaucoup de caractères spéciaux dans le redirect_uri.

Beaucoup de discussions font rage si les paramètres peuvent être transmis. Ils peuvent, vous êtes limité quels caractères sont valides mais personne n'a publié une liste que je connaisse. Les méthodes traditionnelles comme le codage url/html échoueront car le pourcentage (%) n'est pas valide. La barre oblique (/) n'est pas non plus valide, donc une URL de redirection imbriquée échouera toujours. La SEULE façon de surmonter la limitation spéciale de caractères est de coder la valeur du paramètre en base64. Si vous utilisez ASP.NET, recherchez Convert.ToBase64.

Enfin, et c'est plus une note secondaire. Il y a beaucoup de programmeurs qui transmettent des informations erronées qu'une solution simple est de passer type = client_cred. Cela peut limiter votre accès à certaines des autorisations que vous avez demandées dans votre autorisation. C'est déconseillé.

128
Michael

Eu le même problème toute la journée lors des tests avec redirect_uri=http://localhost:8000 (codé en http%3A%2F%2Flocalhost%3A8000) ...

La solution était simplement de s'assurer de mettre la barre oblique de fin / à la fin de l'uri. Donc redirect_uri=http://localhost:8000/ (codé en http%3A%2F%2Flocalhost%3A8000%2F).

Encore une fois, assurez-vous que le redirect_uri est identique pour les deux requêtes.

51
Jason

J'ai eu ce problème. Je savais pertinemment que mes URL étaient les mêmes parce que j'utilisais une classe avec le même $ var, mais j'ai continué à obtenir la réponse 400 et cette erreur dans la réponse JSON.

La seule chose que j'ai faite a été de changer mon redirect_uri de:

http://myredirecturi.com

à

http://myredirecturi.com/

Ouais, je viens d'ajouter la barre oblique de fin et cela a fonctionné.

17
Adam Waite

Vous n'avez pas vraiment besoin d'encoder, mettez simplement le '/' à la fin de votre redirect_url et tout devrait bien se passer!

8
Nizar B.

Une partie des informations fournies par Aaron Wheeler est incorrecte.

Il est vrai que le paramètre 'redirect_uri' doit être identique dans les deux requêtes, cependant il est parfaitement possible d'URL encoder une URL régulière et de l'utiliser comme valeur pour le paramètre 'redirect_url', tant que vous êtes prudent de coder davantage les URL en ligne.

Par exemple, vous souhaitez que Facebook redirige vers l'URL suivante:

http://www.mysite.com/Users/oAuthComplete?my_param_1=/Party/pants

Tentative de rediriger l'utilisateur vers

'https://www.facebook.com/dialog/oauth?client_id=12345&redirect_uri='
. urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1=/Party/pants');

Échouera en tant que /Party/Pants crée une URL non valide

Cependant, la redirection vers

'https://www.facebook.com/dialog/oauth?client_id=12345&redirect_uri='
.urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1='
.urlencode('/Party/pants'));

Fonctionnera comme prévu.

Si vous utilisez la valeur redrect_uri renvoyée dans la seconde, authentifiez la demande d'application, assurez-vous de recoder l'URL - la valeur est automatiquement décodée URL lors du remplissage de la superglobal $ _GET. - C'est ce qui m'a fait trébucher.

'https://graph.facebook.com/oauth/access_token?client_id=12345&&client_secret=SECRET&code=1234567'
.urlencode('http://www.mysite.com/Users/oAuthComplete?my_param_1='
.urlencode($_GET['my_param_1']));

P.s. Dans votre code actuel, je recommanderais d'utiliser sprintf () plutôt que de chaîner des chaînes comme dans mon exemple, pour une meilleure lisibilité.

6
John

D'après ce que je peux voir, le problème ici est que le redirect_uri doit se terminer par '/' et ne pas contenir '?' ou d'autres caractères spéciaux. Je pense que c'est pourquoi vous obtenez "Erreur de validation du code de vérification". Cette erreur apparaît uniquement si vous utilisez file_get_contents (), et non lorsque vous utilisez la bibliothèque php facebook. C'est la solution pour php, je ne sais pas si cette erreur apparaît dans d'autres SDK.

5
DannyD

Je ne sais pas si cela vous aidera, mais je suggère de coder uniquement les valeurs dans l'URL. Pas tout. par exemple:

redirect_uri='http://localhost/test_blog/index.php?r='.urlencode('site/oauth2');
2
Ivan

J'avais le pb et l'ai finalement corrigé en ajoutant le paramètre type = client_cred dans l'url.

1
juamee

J'ai juste eu le même problème.

Certes, je suis un super n00b alors excusez-moi si cette solution n'a aucun sens dans la pratique.

Je mets simplement un petit cookie Fuse (1-2 min) avec une variable de test dans la page avec mon bouton FB Connect. Lorsque FB est revenu avec des informations sur mon script d'analyse/de gestion des données, j'ai vérifié ce cookie où je le redirigeais et s'il était trouvé, j'ai dirigé l'utilisateur vers l'URL appropriée en utilisant header: location.

Bien sûr, certains navigateurs/utilisateurs, etc. désactivent les cookies. Cela ne fonctionnera évidemment pas là-bas (peut-être utiliser une var de session et la détruire dans le gestionnaire de données fb?) Je suis sûr qu'il existe une meilleure façon de le faire, mais pour le moment, ce bandaid fonctionne.

0
Evan M. Rose

La réponse pour moi était la suivante:

$user = $facebook->getUser();     
if (!$user) {
    $loginUrl = $facebook->getLoginUrl(array(
        'scope' => '',
        'redirect_uri' => $this->domain,
    ));
    print('<script> top.location.href=\'' . $loginUrl . '\'</script>');
}

Je me suis fendu la tête longtemps avant de trouver cette solution, semblant que je ne suis pas le seul à avoir ce problème, j'espère que cela fonctionne pour vous!

0
Lars Nieuwenhuizen

J'ai remarqué que vous utilisez Yii que j'utilise également et j'ai eu le même problème pendant la moitié de la journée. Comme mentionné, le problème vient des caractères spéciaux de votre URL i.e. r=site/oath2

Vous pouvez le corriger en activant de jolies URL dans votre configuration afin que votre URL devienne index.php/site/oath2

Il semble que cela fonctionne sans la barre oblique finale.

0
Larry Weya