2012-01-24 3 views
17

Я использую Koala камень на на Ruby, Rails приложения наЗаменить маркер доступа Facebook с Koala

И у меня есть следующий код на модели я использую к данным через Koala:

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

где token_secret происходит от поля моей таблицы users, сохраненной при входе в систему.

Он отлично работает, но через пару минут я получаю:

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

Я нашел способ обновить этот маркер в передней с методами из Facebook JS SDK, но этот метод, когда я получаю список друзей вызывают на контроллере.

Как я могу возобновить token_secret с помощью Koala? Это возможно?

+0

Посмотреть этот вопрос http://stackoverflow.com/questions/6710425/how-do-you-renew-an-expired-facebook-access-token – Gazler

ответ

0

Если вы пытаетесь получить oauth_token для приложения веб-сайта Facebook, вам необходимо использовать процесс Oauth на основе переадресации. Это немного сложно. Для приложения canvas это проще. Вы все равно можете использовать процесс переадресации для приложения canvas, но лучше проанализировать его из signed_request.

Каждый раз, когда пользователь загружает ваше приложение в Facebook, он приземляется на вашей первой странице с параметром «signed_request». Эта зашифрованная строка должна анализироваться в вашем контроллере с помощью объекта Koala. В результате вы можете получить новый oauth_token, который должен быть действительным в течение примерно двух часов. Вот как я это делаю.

#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

В этом проблема, приложение не загружается внутри Facebook, это просто веб-приложение с использованием входа в систему Facebook, и в какой-то момент я использую koala, чтобы получить список друзей, но если я не загружаю другую страницу в мое приложение, а страницу 'friends' th e токен не обновляется, потому что я делаю это через 'JS' на' FB.getLoginStatus (...) ' –

19

Я думал, что отвечу на это, потому что это то, что я только что наткнулся на необходимость делать.

Koala добавлена ​​поддержка для обмена доступа лексемы некоторое время назад, здесь: https://github.com/arsduo/koala/pull/166

Так что моя модель пользователя теперь есть что-то вроде следующего:

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

Я попробую этот, выглядит действительно хорошо. Но прежде чем я попытаюсь, у меня все еще есть пара вопросов: 1. Я использую Graph API '@graph = Koala :: Facebook :: API.new (accessToken)' ... могу ли я использовать 'exchange_access_token_info' там, или мне нужно вместо этого использовать «Koala :: Facebook :: OAuth'? –

+0

'exhange_access_token_info' определен на' Koala :: Facebook :: OAuth', так что да, вы должны использовать его там. – sevenseacat

+6

Я хотел бы указать, что в приведенном выше коде (когда я запускал его только сейчас с koala 1.6.0), new_token ['expiry'] является строкой целого числа секунд до истечения срока действия маркера ... вы может захотеть преобразовать его в то время, когда токен истечет, если вы его сохраните. Что-то вроде (Time.now + new_token ['expires']. To_i) HTH –

Смежные вопросы