2012-12-08 19 views
14

पर टोकन रीफ्रेश करें और रीफ्रेश करें IAuth2 और Google क्लाइंट लाइब्रेरी का उपयोग करके Google एपीआई (कैलेंडर एपीआई से शुरू) तक पहुंचने वाला ऐप विकसित कर रहा है (Appengine और GWT पर है BTW)।ऑफ़लाइन टोकन कैसे प्राप्त करें और Google API

मैंने अपना OAuth2Call बैक सर्वलेट लागू किया है, जो Google AbstractAppEngineAuthorizationCodeCallbackServlet को विस्तारित करता है। स्पष्ट रूप से अनुरोध कर रहा ऑफ़लाइन पहुँच के बावजूद,

1) मैं एक ताज़ा टोकन प्राप्त नहीं है::

मैं यह काम कर रहा है, मैं पहुँच जाते हैं और कैलेंडर आदि देख सकते हैं, लेकिन दो समस्याएं हैं

public static GoogleAuthorizationCodeFlow newFlow(String scope) throws IOException { 
    GoogleAuthorizationCodeFlow.Builder builder = new GoogleAuthorizationCodeFlow.Builder(
      HTTP_TRANSPORT, 
      JSON_FACTORY, 
      getClientSecrets(), 
      Collections.singleton(scope)); 

    builder.setCredentialStore(new AppEngineCredentialStore()).setAccessType("offline"); 

    return builder.build(); 
} 

2) मैं नहीं देख सकता कि स्वचालित रीफ्रेश कार्यक्षमता कैसे सेट करें। इन पृष्ठों तरीकों की व्याख्या:

लेकिन मैं जहां ताज़ा श्रोता जोड़ने के लिए नहीं देख सकता। GoogleAuthorizationCodeFlow.Builder कक्षा में ऐसी कोई विधि Credential.Builder वर्ग

संपादित कोड अधिक डिबगिंग के बाद के विपरीत, जब क्रेडेंशियल (onSuccess() विधि में) वापस आता है यह पहले से ही एक RefreshListener सेट करने लगता है, नहीं है ..... तो हो सकता है कि यह डिफ़ॉल्ट रूप से उनका हो, और मेरी एकमात्र समस्या यह है कि मुझे इसके लिए पूछने के बावजूद refresh_token नहीं मिल रहा है।

शायद Google API कंसोल में सेटिंग्स की समीक्षा करने की आवश्यकता है?

उत्तर

16

एक चीज आपको इसके बारे में सावधान रहना चाहिए: रीफ्रेश टोकन लौटा दिया जाता है (एक्सेस टोकन के अतिरिक्त) जब उपयोगकर्ता अनुरोधित स्कॉप्स के लिए स्पष्ट रूप से सहमति देता है। असल में, जब अनुमोदन पृष्ठ दिखाया जाता है। बाद के सभी प्रवाह केवल एक टोकन पहुंच जाएगा।

अब, अपने आवेदन की जांच करने के लिए और सुनिश्चित करें कि आपको पहली बार रीफ्रेश टोकन प्राप्त होता है, तो आप सुनिश्चित करते हैं कि अनुमोदन पृष्ठ प्रवाह में दिखाया गया है और आप प्राप्त करते हैं तो आप appr_prompt = force पैरामीटर (builder.setApprovalPrompt("force")) का उपयोग कर सकते हैं उपयोगकर्ता से स्पष्ट सहमति। किसी भी समस्या को हल करने के बाद और सुनिश्चित करें कि रीफ्रेश टोकन ठीक से संग्रहीत हैं, आप उस ध्वज को हटा सकते हैं (डिफ़ॉल्ट auto)

अधिक जानकारी डेवलपर मार्गदर्शिका में offline access section में भी उपलब्ध है।

+0

टिप्पणी के लिए धन्यवाद, मैं इन पंक्तियों के साथ जांच करूंगा। फिलहाल, मैं टोकन का एक स्पष्ट निरसन करता हूं, और उसके बाद फिर से अनुरोध करता हूं और मैं हमेशा उपयोगकर्ता के लिए स्पष्ट स्वीकृति स्क्रीन से गुज़रता हूं - लेकिन फिर भी इसे रीफ्रेश_टोकन नहीं मिलता है। –

+0

vlatko, मैं आपके द्वारा जो कुछ भी कहा था * कर रहा था * तत्काल बल को छोड़कर, और ऐसा लगता है कि इसे ठीक कर दिया गया है! तो, आपके जवाब की बहुत सराहना की गई थी! क्या यह एक बग है, या सिर्फ एक चमकदार चूक (बहुत व्यापक ...) दस्तावेज से? –

0

मैंने इसमें देखा, और निष्कर्ष निकाला कि access_token केवल एक बार उपयोग किया जाना चाहिए।

  1. एक अस्थायी ACCESS_TOKEN
  2. उपयोग एक या अधिक अपने ऑपरेशन के लिए आवश्यक प्रश्नों के लिए ACCESS_TOKEN उत्पन्न करने के लिए refresh_token का उपयोग करें: यह है, हर गूगल क्वेरी प्रक्रिया दो चरणों में है।

मैंने सर्वर घड़ी को सिंक्रनाइज़ करने के बारे में यहां कुछ पोस्ट देखी हैं। लेकिन यह अनावश्यक जटिलता की तरह लगता है।

एक अधिक विस्तृत विवरण के लिए: http://www.tqis.com/eloquency/googlecalendar.htm

+0

धन्यवाद सनी। लेकिन समस्या यह थी कि पहली प्राधिकरण पर मुझे एक्सेसटाउन मिल रहा था, लेकिन रीफ्रेश टोकन नहीं, एक्सेसटाइप को "ऑफलाइन" पर सेट करके इसके लिए पूछने के बावजूद। यदि आप Google कक्षाओं का उपयोग करते हैं (एक बार आपके पास रीफ्रेश टोकन हो) तो वे इसे स्टोर करेंगे और इसे समाप्त होने पर स्वचालित रूप से एक नया एक्सेस टोकन प्राप्त करने के लिए इसका उपयोग करेंगे, सभी पारदर्शी रूप से। –

4

ताज़ा टोकन तुम दोनों accessType = "ऑफ़लाइन" और approvalPrompt = "बल" सेट करने के लिए प्राप्त करने के लिए।

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, 
       JSON_FACTORY, CLIENT_ID, CLIENT_SECRET, SCOPE).setAccessType("offline").setApprovalPrompt("force").build(); 
+0

ठीक है, इसके लिए धन्यवाद! .setApprovalPrompt (..) अपेक्षाकृत नई आवश्यकता होनी चाहिए। मेरे पास एक कोड या दो महीने पहले इस विकल्प के बिना काम कर रहा था और यह मुझे टोकन रीफ्रेश दे रहा था। अचानक यह काम करना बंद कर दिया था और मुझे आश्चर्य हुआ कि क्यों। – ThaDon

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