2012-10-09 36 views
7

मेरे पास एक आरओआर ऐप है जहां मैं omniauth और google_oauth2 का उपयोग करके Google के विरुद्ध प्रमाणीकरण कर रहा हूं, जहां मैं ऑफ़लाइन पहुंच का अनुरोध कर रहा हूं।मैं अपने रीफ्रेश टोकन का उपयोग करके अपने google_oauth2 एक्सेस टोकन को रीफ्रेश कैसे करूं?

वर्तमान एक्सेस टोकन का अनुरोध करने के लिए मैं अपने रीफ्रेश टोकन का उपयोग कैसे करूं? साथ ही, जब मैं अब काम नहीं करता हूं तो मैं अपने एक्सेस टोकन को रीफ्रेश कैसे कर सकता हूं? मैं इस स्थिति में कोई यूजर इंटरफेस नहीं लेना चाहता हूं, यह मानते हुए कि प्राधिकरण को हटाया नहीं गया है।

उत्तर

5

मुझे google_oauth2 में कुछ भी दिखाई नहीं देता है जो ताज़ा टोकन के साथ एक नया access_token लाता है, इसलिए ऐसा लगता है कि आपको सीधे एक्सचेंज बनाना होगा।

Google's official OAuth 2.0 documentation बताता है कि इसे निम्न स्तर पर कैसे किया जाए। अपने सर्वर-साइड कोड के भीतर, एक अनुरोध है कि इस तरह दिखता है निर्माण करने के लिए अपने पसंदीदा HTTP ग्राहक का उपयोग करें:

POST /o/oauth2/token HTTP/1.1 
Host: accounts.google.com 
Content-Type: application/x-www-form-urlencoded 

client_id=CLIENT_ID& 
client_secret=CLIENT_SECRET& 
refresh_token=REFRESH_TOKEN& 
grant_type=refresh_token 

जहां CLIENT_ID और CLIENT_SECRET ही हैं जिन्हें आप मूल प्रमाणीकरण और REFRESH_TOKEN के लिए इस्तेमाल कर रहे हैं से ताज़ा टोकन है मूल प्रमाणीकरण प्रवाह। विनिमय सफल होता है, यदि आप एक प्रतिक्रिया है कि कुछ इस तरह दिखता में एक ताजा पहुँच टोकन प्राप्त करेंगे:

{ 
    "access_token":"1/fFBGRNJru1FQd44AzqT3Zg", 
    "expires_in":3920, 
    "token_type":"Bearer", 
} 

आप इस प्रक्रिया का पालन कर सकते एक नया पहुँच टोकन हड़पने के लिए जब भी आप एक की जरूरत है। आप या तो expires_in मान का अनुमान लगाने के लिए उपयोग कर सकते हैं जब आपको किसी नए की आवश्यकता होगी, या जब भी आपका एपीआई अनुरोध 401 HTTP स्थिति के साथ प्रतिक्रिया देता है तो रीफ्रेश करने का प्रयास करें।

9

एक उदाहरण रूबी HTTParty मणि का उपयोग कर के लिए:

कहाँ @auth एक ActiveRecord रिकॉर्ड कि विशिष्ट उपयोगकर्ता के लिए प्रमाणीकरण कुंजियों आप के लिए टोकन ताज़ा करने के लिए कोशिश कर रहे हैं संग्रहीत करता है।

# Refresh auth token from google_oauth2 and then requeue the job. 
    options = { 
    body: { 
     client_id: <YOUR GOOGLE API CLIENT ID HERE>, 
     client_secret: <YOUR GOOGLE API SECRET KEY HERE>, 
     refresh_token: @auth.refresh_token, 
     grant_type: 'refresh_token' 
    }, 
    headers: { 
     'Content-Type' => 'application/x-www-form-urlencoded' 
    } 
    } 
    @response = HTTParty.post('https://accounts.google.com/o/oauth2/token', options) 
    if @response.code == 200 
    @auth.token = @response.parsed_response['access_token'] 
    @auth.expires_in = DateTime.now + @response.parsed_response['expires_in'].seconds 
    @auth.save   
    else 
    Rails.logger.error("Unable to refresh google_oauth2 authentication token.") 
    Rails.logger.error("Refresh token response body: #{@response.body}") 
    end 
+0

आप इसे अपने रेल ऐप में कहां लागू करेंगे? उदाहरण के लिए मुझे टोकरी भेजता है जो httparty का उपयोग कर उपयोगकर्ता संपर्कों को पुनर्प्राप्त करने का अनुरोध प्राप्त होता है, टोकन की समयसीमा समाप्त होने पर मैं रीफ्रेश टोकन पोस्ट कैसे करूं? – Richlewis

+0

मैंने जो कोड ऊपर पोस्ट किया है वह वह कोड है जो टोकन को रीफ्रेश करने के लिए POST अनुरोध करता है। अपना जीईटी अनुरोध करने के बाद, मैं यह देखने के लिए जांच करूंगा कि प्रतिक्रिया कोड 401 के बराबर है या नहीं, आमतौर पर वह कोड होता है जब आपको अपना टोकन रीफ्रेश करने की आवश्यकता होती है। यदि HTTParty प्रतिक्रिया कोड == 401 फिर मेरा कोड चलाएं (आपकी आवश्यकताओं के लिए समायोजित)। – Blake

+0

उत्कृष्ट, मेरा काम मिल गया, धन्यवाद – Richlewis

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

  • कोई संबंधित समस्या नहीं^_^