2013-07-27 9 views
7

महीने पहले मैंने एक रेल ऐप बनाया जो ओएथ 2 का उपयोग करके Google के साथ प्रमाणीकृत - विशेष रूप से, omniauth-google-oauth2 मणि। मेरे पास प्रमाणीकरण बनाने और रीफ्रेश टोकन स्टोर करने के लिए काम करने वाले सभी कदम थे, लेकिन हाल ही में oauth2 ने प्रतिक्रिया के हिस्से के रूप में 'refresh_token' वापस भेजना बंद कर दिया था। मूल रूप से मैं एक प्रतिक्रिया है कि निहित प्राप्त था:मैं omniauth google oauth2 के साथ रेल ऐप के लिए 'refresh_token' कैसे वापस प्राप्त करूं?

credentials: { 
    refresh_token: XXX, 
    token: YYY, 
    expires_at: 1374840767, 
    expires: true 
}, 

अब मैं केवल टोकन कि एक घंटे के भीतर समाप्त हो रहा है वापस पाने:

credentials: { 
    token: YYY, 
    expires_at: 1374840767, 
    expires: true 
}, 

मैं वास्तव में मैं क्या करने के लिए आवेदन की ओर से किया था पता नहीं है इसे बदलें, इसलिए मुझे यकीन नहीं है कि Google के साथ कुछ बदल गया है, या अगर ऐसा कुछ था जो मैंने किया था। संदर्भ के लिए, मेरे कोड लगता है:

initializers/omniauth.rb:

def create 
    auth = request.env["omniauth.auth"] 
    params = request.env["omniauth.params"] 
    project = Project.find(params['project_id']) 

    Authentication.create(:project_id => project.id, :provider => auth['provider'], :uid => auth['uid'], :access_token => auth['credentials']['refresh_token']) 
    flash[:notice] = "Authentication successful." 
    redirect_to owner_view_project_path(project) 
end 

यह संभव कुछ में याद आ रही है है:

Rails.application.config.middleware.use OmniAuth::Builder do 
    provider :google_oauth2, 'KEY', 'SECRET', {:scope => "userinfo.email,userinfo.profile,analytics.readonly,adsense.readonly"} 
end 

authentications_controller.rb जहाँ मैं प्रतिक्रिया प्राप्त है मेरे शुरुआती/omniauth.rb फ़ाइल? मैं विकल्पों हैश में निम्नलिखित को जोड़ की कोशिश की है, लेकिन यह ताज़ा टोकन वापस लाने के लिए नहीं मालूम था:

:approval_prompt => "force", :access_type => "offline" 

किसी भी मदद की बहुत सराहना की जाएगी! अग्रिम में धन्यवाद!

+0

क्या आपने इस समस्या को हल किया है? मैं अब एक ही समस्या का सामना कर रहा हूं और मुझे आपको समाधान देखना अच्छा लगेगा। धन्यवाद! –

उत्तर

8

शीघ्र: 'सहमति' आप एक ताज़ा टोकन हो रही है। कुछ इस तरह काम करना चाहिए:

Rails.application.config.middleware.use OmniAuth::Builder do 
    scopes = [ 
     # we need the profile scope in order to login 
     "https://www.googleapis.com/auth/userinfo.profile", 
     # this and other scopes could be added, but match them up with the 
     # features you requested in your API Console 
     "https://www.googleapis.com/auth/calendar" 
    ] 

    provider :google_oauth2, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, { scope: scopes.join(" "), access_type: 'offline', prompt: 'consent'} 
end 
+0

प्रॉम्प्ट: 'सहमति' ने मेरे लिए यह किया – okysabeni

+0

धन्यवाद संकेत: 'सहमति' ने मुझे बचाया – chickensmitten

+0

पृष्ठभूमि: ऐसा लगता है कि 'refresh_token' केवल तभी शामिल होता है जब उपयोगकर्ता स्पष्ट रूप से पहुंच की पुष्टि करता है (जो हमेशा पहले अनुरोध पर होता है)। प्रमाणीकरण के लिए अनुवर्ती अनुरोध स्वत: पुष्टि की गई हैं क्योंकि Google ने निर्णय को याद किया है, हालांकि, ऑटो-पुष्टिकरणों में 'refresh_token' (जो समझ में आता है) की कमी है। यह उत्तर बताता है कि सहमति को कैसे बल दिया जाए, जो सुनिश्चित करता है कि 'refresh_token' मौजूद होगा। ध्यान दें कि यह प्रत्येक बार अपने प्राधिकरण की पुष्टि करने के लिए उपयोगकर्ता से पूछताछ करेगा। – codener

2

के रूप में मैं देख रहा हूँ, यह आपके प्रदाता की गुंजाइश के लिए

access_type: 'offline' 

जोड़ने के लिए पर्याप्त है।

यह चाल Google परिभाषा में निम्नानुसार है: ताज़ा टोकन केवल पहली बार प्रदान करता है कि आपके ऐप को Google खाते तक पहुंच प्राप्त हो।

प्राधिकरण से इनकार करें और अगर आप देखना चाहते हैं, तो Google द्वारा भेजी गई ताज़ा टोकन मधुमक्खी को फिर से प्राप्त करें।

देखें यहाँ मूल परिभाषा गूगल: "आपके आवेदन पहुंच टोकन को ताज़ा करने के लिए जब उपयोगकर्ता ब्राउज़र में मौजूद नहीं है की जरूरत है, तो access_type का उपयोग करें:। ऑफ़लाइन यह एक ताज़ा टोकन पहले प्राप्त करने के अपने आवेदन में परिणाम होगा समय आपका आवेदन किसी उपयोगकर्ता के लिए प्राधिकरण कोड का आदान-प्रदान करता है। " (https://developers.google.com/identity/protocols/OAuth2WebServer)

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