2012-01-24 16 views
17

estoy usando Koala joya en el Ruby on Rails aplicaciónRenovar Facebook token de acceso con la koala

Y tengo el siguiente código en el modelo que estoy usando para los datos a través de la koala:

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

donde token_secret proviene de un campo de mi tabla users, guardado en el inicio de sesión.

Funciona bien, pero después de un par de minutos me sale:

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

he encontrado la manera de renovar este token en la parte delantera con los métodos de la Facebook JS SDK pero este método donde yo estoy haciendo la lista de amigos se llama en el controlador.

¿Cómo puedo renovar el token_secret usando Koala? ¿es posible?

+0

Ver esta pregunta http://stackoverflow.com/questions/6710425/how-do-you-renew-an-expired-facebook-access-token – Gazler

Respuesta

0

Si está tratando de obtener oauth_token para una aplicación de sitio web de Facebook, debe usar el proceso de Oauth basado en redireccionamiento. Es un poco complicado. Para una aplicación de lienzo, es más simple. Aún puede usar el proceso basado en redireccionamiento para una aplicación de lienzo, pero es mejor analizarlo desde la solicitud firmada.

Cada vez que un usuario carga su aplicación en Facebook, aterrizarán en su primera página con un parámetro "signed_request". Esta cadena cifrada debe analizarse en su controlador con un objeto Koala. Del resultado, puede obtener una nueva oauth_token que debería ser válida durante aproximadamente dos horas. Así es como lo hago.

#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

Ese es el problema, la aplicación no se carga dentro de Facebook, es solo una aplicación web que utiliza el inicio de sesión de Facebook, y en algún momento utilizo koala para recuperar la lista de amigos, pero si no carga ninguna otra página en mi aplicación, sino la página de "amigos" e token no se actualiza, porque hago esto a través de 'JS' en' FB.getLoginStatus (...) ' –

19

Pensé que respondería a esto porque es algo que simplemente encontré la necesidad de hacer.

koala añadido soporte para el intercambio de fichas de acceso hace algún tiempo, aquí: https://github.com/arsduo/koala/pull/166

Así que mi modelo de usuario tiene ahora algo como lo siguiente:

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

Voy a probar ese, se ve muy bien. Pero antes de intentarlo, todavía tengo un par de preguntas: 1. Estoy usando Graph API '@graph = Koala :: Facebook :: API.new (accessToken)' ... ¿Puedo usar 'exchange_access_token_info' allí o debería tener para usar 'Koala :: Facebook :: OAuth' en su lugar? –

+0

'exhange_access_token_info' se define en' Koala :: Facebook :: OAuth', así que sí debe usarlo allí. – sevenseacat

+6

Me gustaría señalar que en el código anterior (cuando lo ejecuté con koala 1.6.0), new_token ['expiry'] es una cadena de un número entero de segundos hasta que el token expire ... usted podría querer convertirlo a un momento en que el token expirará si lo está guardando. Algo así como (Time.now + new_token ['expires']. To_i) HTH –

Cuestiones relacionadas