2012-01-24 31 views
17

Tôi đang sử dụng Koala đá quý trên trên Ruby on Rails ứng dụngRenew Facebook access token với Koala

Và tôi có đoạn mã sau vào mô hình tôi đang sử dụng cho các dữ liệu thông qua Koala:

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

nơi token_secret xuất phát từ một trường trong bảng users của tôi, được lưu trên thông tin đăng nhập.

Nó hoạt động tốt nhưng sau một vài phút, tôi nhận được:

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

tôi tìm thấy con đường để làm mới thẻ này ở phía trước với các phương pháp từ Facebook JS SDK nhưng phương pháp này mà tôi nhận được danh sách các bạn bè được gọi trên bộ điều khiển.

Tôi làm cách nào để gia hạn token_secret bằng Koala? điều này có thể không?

+0

Xem câu hỏi này http://stackoverflow.com/question/6710425/how-do-you-renew-an-hết-facebook-access-token – Gazler

Trả lời

0

Nếu bạn đang cố gắng để có được oauth_token cho một ứng dụng trang web Facebook, bạn cần phải sử dụng quá trình Oauth dựa trên chuyển hướng. Đó là một chút phức tạp. Đối với ứng dụng canvas, nó đơn giản hơn. Bạn vẫn có thể sử dụng quy trình dựa trên chuyển hướng cho ứng dụng canvas, nhưng tốt hơn là phân tích nó từ signed_request.

Mỗi lần người dùng tải ứng dụng của bạn trong Facebook, họ sẽ truy cập trang đầu tiên của bạn bằng thông số "signed_request". Chuỗi được mã hóa này phải được phân tích cú pháp trong bộ điều khiển của bạn với một đối tượng Koala. Từ kết quả, bạn có thể nhận được một oauth_token mới sẽ có hiệu lực trong khoảng hai giờ. Đây là cách tôi làm điều đó.

#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

Đó là vấn đề, ứng dụng không tải bên trong Facebook, Nó chỉ là một ứng dụng web sử dụng đăng nhập Facebook, và tại một số điểm tôi sử dụng koala để lấy danh sách bạn bè nhưng nếu tôi không tải bất kỳ trang nào khác trên ứng dụng của tôi nhưng trang 'bạn bè' e token không được cập nhật, bởi vì tôi làm điều này thông qua 'JS' trên' FB.getLoginStatus (...) ' –

19

Tôi nghĩ tôi sẽ trả lời câu hỏi này vì đó là điều tôi vừa mới gặp phải.

Koala thêm hỗ trợ cho việc trao đổi truy cập mã thông báo một số thời gian trước đây, ở đây: https://github.com/arsduo/koala/pull/166

Vì vậy, mô hình tài khoản của tôi bây giờ có một cái gì đó như sau:

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

Tôi sẽ thử cái đó, trông rất đẹp. Nhưng trước khi tôi thử tôi vẫn còn có một vài câu hỏi: 1. Tôi đang sử dụng Graph API '@graph = Koala :: Facebook :: API.new (accessToken)' ... tôi có thể sử dụng 'exchange_access_token_info' ở đó hay tôi nên có sử dụng 'Koala :: Facebook :: OAuth' để thay thế? –

+0

'exhange_access_token_info' được định nghĩa trên' Koala :: Facebook :: OAuth', vì vậy có bạn phải sử dụng nó ở đó. – sevenseacat

+6

Tôi muốn chỉ ra rằng trong đoạn mã trên (khi tôi chạy nó ngay bây giờ với koala 1.6.0), new_token ['expiry'] là một chuỗi số nguyên số giây cho đến khi mã thông báo hết hạn ... bạn có thể muốn chuyển đổi nó thành thời điểm khi mã thông báo sẽ hết hạn nếu bạn đang lưu nó. Một cái gì đó như (Time.now + new_token ['expires']. To_i) HTH –

Các vấn đề liên quan