2012-04-20 11 views
22

मैं अमेरिकन प्लान के खिलाफ उपयोगकर्ता को प्रमाणित करने के लिए (और उपयोगकर्ता के लिए एक अमेरिकन प्लान OAuth पहुंच टोकन प्राप्त करने के लिए) omniauth-फेसबुक का उपयोग करता है एक रेल एप्लिकेशन लिख रहा हूँ। ऐप तब सहेजे गए ओथ टोकन का उपयोग करके एफबी ग्राफ एपीआई को विभिन्न कॉल करने के लिए कोआला का उपयोग करता है।फेसबुक टोकन समाप्ति और नवीकरण, कोआला के साथ और omniauth-फेसबुक

जब भी उपयोगकर्ता पुनः प्रमाणीकरण करता है तो वे सहेजे गए टोकन को अपडेट करते हैं (आमतौर पर जब वे मेरे ऐप में लॉग इन होते हैं)। फिर भी, सहेजे गए टोकन समय-समय पर समाप्त हो जाएंगे (या अन्यथा अमान्य हो जाएंगे)।

कोला का उपयोग करते समय ऑथ विफलताओं के खिलाफ सुरक्षा और टोकन को अपडेट करने के आसपास सबसे अच्छा अभ्यास क्या है?

क्या सभी कॉल प्रारंभ/बचाव ब्लॉक में लपेटा जाना चाहिए, अपवाद हैंडलर के साथ जो उपयोगकर्ता को एफबी के खिलाफ पुनः प्रमाणित करता है?

क्या here वर्णित 'विस्तारित एक्सेस टोकन' प्रक्रिया का लाभ उठाने के लिए कुछ तरीका (कोआला का उपयोग करना) है? यदि नहीं, तो कोआला कॉल से खुद को नया टोकन निकालने के लिए अपना खुद का कोड लिखने पर सर्वोत्तम प्रथाएं हैं?

उत्तर

16

मेरे पास जो पहले है वह पहले_फिल्टर है जो हर पृष्ठ पर ट्रिगर होता है जिसके लिए एक सक्रिय फेसबुक सत्र की आवश्यकता होती है। इस तरह कुछ काम करना चाहिए:

before_filter :reconnect_with_facebook 
    def reconnect_with_facebook 
    if current_account && current_account.token_expired?(session[:fb]["expires"]) 

    # re-request a token from facebook. Assume that we got a new token so 
    # update it anyhow... 
    session[:return_to] = request.env["REQUEST_URI"] unless request.env["REQUEST_URI"] == facebook_request_path 
    redirect_to(with_canvas(facebook_request_path)) and return false 
    end 
end 

token_expired? विधि इस प्रकार है:

def token_expired?(new_time = nil) 
    expiry = (new_time.nil? ? token_expires_at : Time.at(new_time)) 
    return true if expiry < Time.now ## expired token, so we should quickly return 
    token_expires_at = expiry 
    save if changed? 
    false # token not expired. :D 
end 
+0

उत्तर के लिए धन्यवाद। सत्र कहां/कैसे है [: एफबी] ["समाप्त हो जाता है]] सेट हो रहा है? आप इसे उपरोक्त अपनी reconnect_with_facebook विधि में उपयोग करते हैं। –

+0

मैंने सेट किया कि पहली बार कोई सत्र बनाने के लिए सफलतापूर्वक साइन इन करता है। अन्य सभी कनेक्ट को "रीकनेक्ट" माना जाता है – heavysixer

+0

धन्यवाद। मैंने कुछ हद तक अलग-अलग लागू किया, लेकिन यह मुझे सही रास्ते पर लाने में सहायक था। –

16

मैं दिखाने के लिए कि कैसे आप 60 दिन के लिए एक अल्पकालिक टोकन विनिमय कर सकते हैं this post जो Railscast on Facebook से कोड adapts भर में आया था:

user.rb

def self.from_omniauth(auth) 

    # immediately get 60 day auth token 
    oauth = Koala::Facebook::OAuth.new(ENV["FACEBOOK_APP_ID"], ENV["FACEBOOK_SECRET"]) 
    new_access_info = oauth.exchange_access_token_info auth.credentials.token 

    new_access_token = new_access_info["access_token"] 
    # Facebook updated expired attribute 
    new_access_expires_at = DateTime.now + new_access_info["expires_in"].to_i.seconds 

    where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user| 
     user.provider = auth.provider 
     user.uid = auth.uid 
     user.name = auth.info.name 
     user.image = auth.info.image 
     user.email = auth.info.email 
     user.oauth_token = new_access_token #originally auth.credentials.token 
     user.oauth_expires_at = new_access_expires_at #originally Time.at(auth.credentials.expires_at) 
     user.save! 
    end 
    end 
+0

कोड स्निपेट के लिए धन्यवाद! – okysabeni

+0

धन्यवाद यह एक अच्छी विधि है। मुझे कुछ समय लिया यह पता लगाने की क्यों मेरे परीक्षण एक 'कोआला :: फेसबुक :: OAuthTokenRequestError के बारे में शिकायत गया: प्रकार: OAuthException, कोड: 101, संदेश: लापता client_id पैरामीटर। [HTTP 400] '। आखिरकार, मुझे एहसास हुआ कि मैं 'ENV [" FACEBOOK_APP_ID "]' या 'secrets.yml' में अपने परीक्षण पर्यावरण के लिए' ENV [ "FACEBOOK_SECRET"] 'परिभाषित नहीं किया था। – DazBaldwin

0

आप ऐसा कुछ कर सकते हैं जहां आप जांचते हैं कि access_token की समयसीमा समाप्त हो गई है और कोई अन्य उत्पन्न होता है।

%w[facebook].each do |provider| 
    scope provider, -> { where(provider: provider) } 
end 

def client 
    send("#{provider}_client") 
end 

def expired? 
    expires_at? && expires_at <= Time.zone.now 
end 

def access_token 
    send("#{provider}_refresh_token!", super) if expired? 
    super 
end 

def facebook_refresh_token!(token) 
    new_token_info = 
    Koala::Facebook::OAuth.new.exchange_access_token_info(token) 
    update(access_token: new_token_info["access_token"], expires_at: Time.zone.now + new_token_info["expires_in"]) 
end 

आप gorails screencast देख सकते हैं जो इसे गहराई से समझाता है।

संबंधित मुद्दे