2012-01-24 26 views
17

Używam Koala gem on na Ruby on Rails aplikacjiRenew Facebook token dostępu z Koala

I mam następujący kod na modelu używam do danych przez Koala:

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

gdzie token_secret pochodzi z pola mojej tabeli users, zapisanego przy logowaniu.

To działa dobrze, ale po paru minutach otrzymujemy:

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

znalazłem sposób odnowić ten token z przodu z metodami z Facebook JS SDK ale ta metoda gdzie Dostaję listy przyjaciele są wywoływani na kontrolerze.

Jak mogę odnowić token_secret za pomocą Koali? czy to możliwe?

+0

zobaczyć to pytanie http://stackoverflow.com/questions/6710425/how-do-you-renew-an-expired-facebook-access-token – Gazler

Odpowiedz

0

Jeśli próbujesz uzyskać oauth_token dla aplikacji na Facebooku, musisz użyć procesu Oauth opartego na przekierowaniu. To trochę skomplikowane. W przypadku aplikacji canvas jest to prostsze. Nadal możesz używać procesu opartego na przekierowaniu dla aplikacji canvas, ale lepiej jest przeanalizować ją pod kątem signed_request.

Za każdym razem, gdy użytkownik załaduje twoją aplikację na Facebooku, trafi na twoją pierwszą stronę z parametrem "signed_request". Ten zaszyfrowany ciąg musi zostać przeanalizowany w kontrolerze za pomocą obiektu Koala. Z wyniku otrzymasz nowy oauth_token, który powinien być ważny przez około dwie godziny. Oto, jak to robię.

#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

To jest problem, aplikacja nie ładuje się na Facebooku, to tylko aplikacja internetowa korzystająca z Facebooka, a w pewnym momencie używam koala, aby pobrać listę znajomych, ale jeśli nie ładuję żadnej innej strony w mojej aplikacji, ale strona "przyjaciele" e token nie jest aktualizowany, ponieważ robię to przez 'JS' na' FB.getLoginStatus (...) ' –

19

Pomyślałem, że odpowiem na to pytanie, ponieważ jest to coś, co właśnie napotkałem.

Koala dodano wsparcie dla wymiany tokenów dostępu jakiś czas temu tutaj: https://github.com/arsduo/koala/pull/166

Więc mój model Użytkownik ma teraz coś jak następuje:

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

Spróbuję, ten, wygląda naprawdę dobrze. Ale zanim spróbuję, mam jeszcze kilka pytań: 1. Używam Graph API '@graph = Koala :: Facebook :: API.new (accessToken)' ... czy mogę użyć 'exchange_access_token_info' tam lub powinienem zamiast tego użyć 'Koala :: Facebook :: OAuth'? –

+0

'exhange_access_token_info' jest zdefiniowany na' Koala :: Facebook :: OAuth', więc tak, musisz go tam użyć. – sevenseacat

+6

Chciałbym zaznaczyć, że w powyższym kodzie (kiedy uruchomiłem go teraz z koala 1.6.0), new_token ['expiry'] jest ciągiem całkowitych sekund, aż token wygaśnie ... ty może chcieć przekonwertować go na czas wygaśnięcia tokena, jeśli go zapisujesz. Coś jak (Time.now + new_token ['expires']. To_i) HTH –