Facebook OAuth Login - API access_token retournant "Ce code d'autorisation a été utilisé"
Cette question a été posée plusieurs fois sur Pile, mais il n'ya pas eu de vraies réponses. Permettez-moi d'essayer d'expliquer ma situation, de toute façon.
Nous utilisons une application qui utilise Facebook OAuth2 de connexion. Cette connexion utilisées pour fonctionner correctement jusqu'à la semaine dernière, et tout d'un coup, il est troublant de nous maintenant.
Flux D'Application:
Étape 1: Utilisateur appuie sur connexion avec Facebook bouton sur notre site web
Étape 2: Redirigé vers Facebook login/autorisation page
Étape 3: Sur l'autorisation de l'application, la fonction de rappel vient à notre application, avec une courte durée "code" param.
Étape 4: Ce "code" param serait échangé pendant 60 jours jeton d'Accès à l'aide de "https://graph.facebook.com/oauth/access_token" URL.
Erreur dans l'Étape 4:
Lorsque nous essayons d'échange de court séjour "code" pour le jeton d'accès, on obtient cette erreur de Facebook.
{"error":{"message":"This authorization code has been used.","type":"OAuthException","code":100}}
Observation:
- Pour les utilisateurs qui sont nouveaux à l'application, au-dessus de ladite erreur ne se produit pas.
- Pour un retour d'utilisateur de cet appel échoue avec l'-dessus de ladite erreur.
- Notre application en ligne pour plus de 9 mois maintenant, et cette erreur n'a été que dans le passé de 7 à 10 jours. Nous avons eu des milliers d'utilisateurs de l'utiliser avec succès avant que.
Ce que j'ai déjà eu de Forums:
Voici mon interprétation de ce que j'ai lu. Peuvent être inexacts.
Facebook est un peu bizarre de la politique, ce qui nécessite le développeur de l'application pour maintenir la temporaire de 10 minutes de code jusqu'à ce que la période de 60 jours code qui a été obtenu lors de la première connexion expire. Donc, nous devrions créer un cookie avec le jeton d'Accès sur le navigateur de l'utilisateur. Je n'étais même plus capable de voir des gens de modifier leur code afin de créer les cookies.
Ce qui est vraiment à me tracasser?
- Les solutions proposées suppose que le cookie qu'ils créent, qui serait présent dans le navigateur de l'utilisateur toujours. C'est une mauvaise hypothèse, comme le cookie peut être effacé à tout moment.
- J'ai une autre Id de l'application/le secret de l'app que j'utilise pour mon développement (j'.e localhost), et qui fonctionne parfaitement. La connexion se passe amende, Mais ses seulement le produit de la machine qui a le problème.
- Ce problème ne s'est pas produit sur la machine de production de près de 10 mois, nous avons lancé l'application, et il est venu tout d'un coup. Le pire de tous, je n'arrive pas à obtenir un enregistrement de changements récents qui rompt ce flux.
Edit:
Plate-Forme: Python, Google Appengine. Nous n'utilisons pas de Facebook Sdk, nous faisons HTTP directe des Appels à toutes les Url de connexion.
Appel échoue : https://graph.facebook.com/oauth/access_token - nous sommes en train de le appId, secret et le code (obtenu à partir de facebook) dans les 20 secondes suivant le premier appel qui se passe.
Espère qu'il y aura assez d'informations ici de montrer que notre code n'est pas totalement erronée. Toutes les suggestions de personnes qui ont rencontré et résolu ce problème est la Bienvenue. Si ses un Facebook bug, et le Facebook dev vient de remarquer, je serais encore plus heureux.
source d'informationauteur Srivatsan
Vous devez vous connecter pour publier un commentaire.
J'ai contourné ce problème en utilisant un GUID aléatoire qui est ajouté à chaque url de callback je passe en facebook. Il semble que le code que facebook renvoie est composé de quelques pièces, y compris le paramètre redirect_uri vous devez spécifier. En utilisant ce GUID astuce, votre application continue de travailler mais facebook pense que c'est une URL différente d'où la génération d'un nouveau code.
Si vous stockez ce GUID dans une session temporaire, c'est toujours la même. Voici un très version réduite de ce que je veux dire. Je suis à l'aide de C#, mais la solution sera la même:
Avant de commencer le processus d'authentification oauth:
Alors pour le coup d'envoi de la connexion:
Et puis, dans ma méthode de rappel, quand je veux l'échange qui code pour une nouvelle access_token:
Note dans cette seconde méthode, je suis en utilisant la même clé de session pour que le code d'autorisation est réussie.
Été de tester ce matin par la révocation des autorisations /modifier manuellement mon stockées access_token (dans ma db) /suppression de mon stockées access_token complètement et il fonctionne à chaque fois.
Espérons que cette aide!
J'ai eu du mal avec cela aujourd'hui pour un temps trop. Vous ne savez pas si vous êtes en utilisant le Facebook de la classe PHP (à partir de ce que vous avez écrit, il semble que vous n'avez pas), cependant, il pourrait être un pointeur de toute façon le problème était que le Facebook PHP bibliothèque semble pour obtenir le jeton du code automatiquement et j'ai essayé de le faire à nouveau.