2012-01-24 17 views
17

sto usando Koala gioiello su Ruby on Rails applicazioneRinnova Facebook token di accesso con Koala

E ho il seguente codice sul modello che sto usando per i dati attraverso Koala:

@graph = Koala::Facebook::GraphAPI.new(token_secret) 
friends = @graph.get_connections("me", "friends") 

dove token_secret proviene da un campo della mia tabella users, salvato sul login.

Funziona bene, ma dopo un paio di minuti ottengo:

Koala::Facebook::APIError (OAuthException: Error validating access token: Session has expired at unix time 1327438800. The current unix time is 1327442037.): 

ho trovato il modo di rinnovare questo token nella parte anteriore con i metodi della Facebook JS SDK ma questo metodo dove sto ottenendo l'elenco dei gli amici sono chiamati sul controller.

Come posso rinnovare il token_secret utilizzando Koala? È possibile?

+0

Vedere questa domanda http://stackoverflow.com/questions/6710425/how-do-you-renew-an-expired-facebook-access-token – Gazler

risposta

0

Se si sta tentando di ottenere oauth_token per un'applicazione di sito Web di Facebook, è necessario utilizzare il processo Oauth basato sul reindirizzamento. È un po 'complicato. Per un'app canvas, è più semplice. Puoi ancora utilizzare il processo di reindirizzamento per un'app canvas, ma è meglio analizzarlo da firm_request.

Ogni volta che un utente carica la tua app su Facebook, atterrerà sulla tua prima pagina con un parametro "signed_request". Questa stringa crittografata deve essere analizzata nel controller con un oggetto Koala. Dal risultato, puoi ottenere un nuovo oauth_token che dovrebbe essere valido per circa due ore. Ecco come lo faccio.

#Create a new koala Oauth object. 
oauth = Koala::Facebook::OAuth.new(APP_ID, APP_SECRET) 

#Get the new oauth_token from the signed request. 
your_new_oauth_token = oauth.parse_signed_request(params[:signed_request])["oauth_token"] 
+0

Questo è il problema, l'applicazione non si carica all'interno di Facebook, è solo un'applicazione web che utilizza il login di Facebook, e ad un certo punto che uso koala per recuperare la lista degli amici ma se non carico altre pagine sulla mia app ma la pagina 'friends' th Il token non viene aggiornato, perché lo faccio tramite 'JS' su' FB.getLoginStatus (...) ' –

19

Ho pensato di rispondere perché è una cosa che ho appena incontrato nel bisogno di fare.

Koala aggiunto il supporto per lo scambio di token di accesso di qualche tempo fa, qui: https://github.com/arsduo/koala/pull/166

Quindi il mio modello User ha ora qualcosa di simile al seguente:

def refresh_facebook_token 
    # Checks the saved expiry time against the current time 
    if facebook_token_expired? 

    # Get the new token 
    new_token = facebook_oauth.exchange_access_token_info(token_secret) 

    # Save the new token and its expiry over the old one 
    self.token_secret = new_token['access_token'] 
    self.token_expiry = new_token['expires'] 
    save 
    end 
end 

# Connect to Facebook via Koala's oauth 
def facebook_oauth 
    # Insert your own Facebook client ID and secret here 
    @facebook_oauth ||= Koala::Facebook::OAuth.new(client_id, client_secret) 
end 
+0

Ci proverò, sembra davvero buono. Ma prima di provare ho ancora un paio di domande: 1. Sto usando Graph API '@graph = Koala :: Facebook :: API.new (accessToken)' ... posso usare 'exchange_access_token_info' lì o dovrei avere utilizzare invece 'Koala :: Facebook :: OAuth'? –

+0

'exhange_access_token_info' è definito su 'Koala :: Facebook :: OAuth', quindi sì è necessario utilizzarlo lì. – sevenseacat

+6

Vorrei sottolineare che nel codice precedente (quando l'ho eseguito solo ora con koala 1.6.0), new_token ['expiry'] è una stringa di un numero intero di secondi fino alla scadenza del token ... tu potrebbe voler convertirlo in un momento in cui il token scadrà se lo stai salvando. Qualcosa come (Time.now + new_token ['expires']. To_i) HTH –

Problemi correlati