14

Questa domanda è stata posta alcune volte su Stack, ma non sono state fornite risposte reali. Lasciami provare comunque a spiegare la mia situazione.Facebook OAuth Login - access_token API che restituisce "Questo codice di autorizzazione è stato utilizzato"

Utilizziamo un'applicazione che utilizza il login Facebook OAuth2. Questo login ha funzionato fino alla scorsa settimana e all'improvviso ci sta preoccupando.

Applicazione di flusso:

Fase 1: presse utente di accesso con il tasto Facebook sul nostro sito web

Fase 2: Redirect alla pagina Facebook di accesso/autorizzazione

Fase 3 : Quando si autorizza l'applicazione, il callback arriva alla nostra applicazione, con un parametro "codice" di breve durata.

Fase 4: Questo "codice" param sarebbe stato scambiato per un giorno 60 token di accesso utilizzando "https://graph.facebook.com/oauth/access_token" URL.

errore nel passaggio 4:

Quando cerchiamo di scambiare la breve vita "codice" per il token di accesso, si ottiene questo errore da Facebook.

{"error":{"message":"This authorization code has been used.","type":"OAuthException","code":100}} 

Osservazione:

  1. Per gli utenti che sono nuova Venendo per l'applicazione, l'errore suddetto non si verifica.
  2. Per un utente di ritorno questa chiamata ha esito negativo con l'errore sopra indicato.
  3. La nostra applicazione è attiva da più di 9 mesi e questo errore è arrivato solo negli ultimi 7-10 giorni. Abbiamo avuto migliaia di utenti che lo utilizzano con successo prima di questo.

Quello che ho già avuto da Forum:

Ecco la mia interpretazione di quello che ho letto. Potrebbe essere impreciso Facebook ha una politica strana che richiede allo sviluppatore dell'app di mantenere il codice temporaneo di 10 minuti fino alla scadenza del codice di 60 giorni ottenuto durante il primo accesso. Quindi dovremmo creare un cookie con il token di accesso sul browser dell'utente. Sono stato persino in grado di vedere persone che modificano il loro codice per creare i cookie.

Cosa mi dà davvero fastidio?

  1. Le soluzioni suggerite presuppongono che il cookie che creano sia sempre presente nel browser dell'utente. Questa è una cattiva ipotesi da fare, in quanto il cookie può essere cancellato in qualsiasi momento.
  2. Ho un altro app/app segreto che utilizzo per il mio sviluppo (i.e localhost) e che funziona perfettamente. L'accesso avviene bene là fuori, ma è solo la macchina del prodotto che ha il problema.
  3. Questo problema non si è verificato sulla macchina di produzione per quasi 10 mesi da quando abbiamo lanciato l'app, ed è arrivato all'improvviso. Peggio ancora, non sono in grado di ottenere alcuna registrazione delle modifiche recenti che interrompono questo flusso.

Edit:

Piattaforma: Python, Google AppEngine. Non utilizziamo alcun SDK di Facebook, effettuiamo chiamate HTTP dirette a tutti gli URL di accesso. Chiamata fallita: https://graph.facebook.com/oauth/access_token - stiamo passando l'appId, il segreto e il codice (ottenuti da facebook) entro 20 secondi dalla prima chiamata in corso.

Spero ci siano sufficienti informazioni per dimostrare che il nostro codice non è completamente errato. Qualsiasi suggerimento/suggerimento da parte di persone che hanno riscontrato e risolto questo problema è benvenuto. Se si tratta di un bug di Facebook e l'app di Facebook viene a conoscenza, sarei ancora più felice.

+0

Il parametro di codice può essere scambiato solo per un token di accesso utente una volta. Nella tua domanda mancano informazioni utili su quale piattaforma/lingua stai utilizzando e quali sono le tue esatte chiamate API. – CBroe

+0

@CBroe - Grazie per la notifica. Sì, comprendiamo che il codice param è una cosa una tantum e questo è il motivo per cui vogliamo scambiarlo per access_token, ma l'URL del token di accesso non funziona. Ho incluso informazioni sulla piattaforma/lingua. – Srivatsan

risposta

0

Ho lottato con questo oggi anche per un po '. Non sono sicuro se stai usando la classe PHP di Facebook (da quello che hai scritto, sembra che tu non lo sia), tuttavia, potrebbe essere comunque un puntatore - il problema era che la libreria PHP di Facebook sembra ottenere il token dal codice automaticamente e stavo cercando di farlo di nuovo.

+0

Ho avuto anche questo problema. Funziona bene quando chiamo il punto 4 sopra (graph.facebook.com/oauth/access_token) prima di utilizzare l'SDK PHP di Facebook. Ma se lo chiamo dopo, ricevo "Questo codice di autorizzazione è stato usato". Il token memorizzato nell'SDK ha un formato diverso da quello restituito dall'endpoint e non ho visto una data di scadenza nell'SDK.Quindi, se questi token sono diversi, perché Facebook restituisce l'errore in questo caso? –

4

Ho risolto questo problema utilizzando un GUID casuale che viene aggiunto a ciascun url di richiamata che passo su Facebook. Sembra che il codice restituito da Facebook sia composto da alcune parti, incluso il parametro redirect_uri che devi specificare. Usando questo trucco GUID, la tua app continua a funzionare, ma Facebook pensa che sia un URL diverso, generando quindi un nuovo codice.

Se si memorizza tale GUID in una sessione temporanea, è sempre lo stesso. Ecco una versione molto ridotta di ciò che intendo. Sto usando C#, ma la soluzione sarà la stessa:

prima di iniziare il processo di OAuth:

Session["facebook_buster"] = System.Guid.NewGuid().ToString(); 

Quindi per dare il via alla login:

var facebook = new FacebookClient(); 

var loginUrl = facebook.GetLoginUrl(new 
{ 
    client_id = ..., 
    redirect_uri = ..."/facebook/oauthcallback?buster=" + Session["facebook_buster"].ToString(), 
    display = "popup", 
    scope = "publish_stream,user_photos" 
}); 

E poi nel mio callback metodo, quando voglio scambiare quel codice per un nuovo token di accesso:

var facebook = new FacebookClient(); 

dynamic result = facebook.Post("oauth/access_token", new 
{ 
    client_id = ..., 
    client_secret = ..., 
    redirect_uri = ..."/facebook/oauthcallback?buster=" + Session["facebook_buster"].ToString(), 
    code = Request["code"] // this is the returned code from the first method 
}); 

Nota in quel secondo metodo sono io la stessa chiave di sessione in modo che il codice di autorizzazione abbia successo.

Testato tutto questo stamattina revocando le autorizzazioni/modificando manualmente il mio access_token memorizzato (nel mio db)/rimuovendo completamente il mio access_token memorizzato e funziona sempre.

Spero che questo aiuti!

+1

Nessun sigaro, https://github.com/HabitRPG/habitrpg/issues/4221#issuecomment-61855507 – lefnire

+0

Grazie signore. A prima vista non avrei potuto funzionare così. Ma l'ho implementato in PHP e voilà! I token di accesso a lungo termine ancora. Per i nuovi arrivati ​​a questo problema, Facebook deve utilizzare il parametro 'redirect_uri' nella generazione del codice a lungo termine. Fondamentalmente stiamo ingannando il loro algoritmo per creare codici unici a lungo termine senza 10 minuti di tempo. Assolutamente geniale –

+0

solo una FYI, aggiunto un parametro di cache breaker al mio redirect_uri, quando ho ottenuto l'url di login in PHP, e ha ottenuto lo stesso risultato di questo, presumo .. ha funzionato .. :) non posso credere a questo errore con fb. . Un po 'ridicolo? stava dicendo che ho già usato i codici di autenticazione, se ho mantenuto il redirect_uri lo stesso di un precedente tentativo di autenticazione? davvero confuso, oh, va bene – jfaron

Problemi correlati