5

के माध्यम से Google संपर्क एपीआई एक्सेस करना मैं वर्तमान में ओएथ 2.0 और एक तथाकथित सेवा खाते के माध्यम से Google संपर्कों तक पहुंच लागू कर रहा हूं। सेवा खाता सामान्य उपयोगकर्ता के लिए "[email protected]" उत्पन्न होता है।ओएथ 2.0 और निजी कुंजी उर्फ ​​सेवा खाता

कोड OAuth 2.0 साख उत्पन्न करने के लिए है: यह है कि मैं किसी भी एक संपर्क नहीं मिलता है

ContactsService myService = new ContactsService(
      "myApp"); 

    myService.setOAuth2Credentials(getCredentials()); 

    URL feedUrl = new URL("https://www.google.com/m8/feeds/contacts/default/full"); 
    Query myQuery = new Query(feedUrl); 
    ContactFeed resultFeed = myService.query(myQuery, ContactFeed.class); 
    // Print the results 

    for (ContactEntry entry : resultFeed.getEntries()) { 
     System.out.println(entry.getName().getFullName().getValue()); 
     System.out.println("Updated on: " + entry.getUpdated().toStringRfc822()); 
    } 
समस्या

:

public static GoogleCredential getCredentials() throws GeneralSecurityException, IOException { 
    GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
      .setJsonFactory(JSON_FACTORY) 
      .setServiceAccountId(SingleUserCredentials.SERVICE_ACCOUNT_EMAIL) 
      .setServiceAccountScopes("https://www.google.com/m8/feeds") 
      .setServiceAccountPrivateKeyFromP12File(new File(SingleUserCredentials.SERVICE_ACCOUNT_PKCS12_FILE_PATH)) 
      .build(); 
    credential.refreshToken(); 
    return credential; 
} 

मैं तो के माध्यम से संपर्क प्राप्त करने का प्रयास कर रहा हूँ मेरे खाते से फ़ीड हमेशा खाली है। कोई त्रुटि नहीं है कुछ भी तो नहीं।

एक ही दृष्टिकोण के माध्यम से Google Apps प्रबंधित डोमेन तक पहुंचने पर यह अच्छी तरह से काम करता है।

मुझे आश्चर्य है कि संपर्क एपीआई सामान्य (उर्फ @ gmail.com) खातों के लिए ओएथ 2.0 का समर्थन करता है जब पी 12 कुंजी फ़ाइल और सेवा खाता का उपयोग करते हैं।

उत्तर

1

मैं खुद को उसी समस्या में भाग गया।

मैंने डोमेन व्यवस्थापक के कुंजी और ईमेल पते को सेट करते समय प्राप्त किए गए ईमेल पते को आजमाया।

जब मैं कुंजी सेटअप से ईमेल का उपयोग करता हूं, मुझे कुछ भी प्राप्त नहीं होता है - कोई चेतावनी नहीं, कोई अपवाद नहीं, और कोई डेटा नहीं।

जब मैं किसी डोमेन व्यवस्थापक के ईमेल पते का उपयोग, मैं एक अपवाद प्राप्त करते हैं:

com.google.api.client.auth.oauth2.TokenResponseException: 400 OK 
    [java] { 
    [java] "error" : "invalid_grant" 
    [java] } 
    [java] Feb 5, 2013 5:16:48 PM com.google.appengine.repackaged.org.apache.http.impl.client.DefaultRequestDirector handleResponse 
    [java] WARNING: Authentication error: Unable to respond to any of these challenges: {} 
    [java] Feb 5, 2013 5:16:48 PM com.google.apphosting.utils.jetty.JettyLogger warn 
    [java] WARNING:/
    [java] java.lang.NullPointerException: No authentication header information 

...

तो, मैं लगा डोमेन व्यवस्थापक का ईमेल पता है कि मैं क्या नहीं जरूरी था कि ।

इसके बाद, मैं इस पेज को खोजने से पहले थोड़ी देर के लिए चारों ओर Google पर:

http://javadoc.google-api-java-client.googlecode.com/hg/1.13.2-beta/com/google/api/client/googleapis/auth/oauth2/GoogleCredential.html

मैं वहाँ getServiceAccountUser देखा()। क्षेत्र का विवरण था:

उपयोगकर्ता का ईमेल पता देता है कि एप्लिकेशन किसी भी सेवा के लिए सेवा खाता प्रवाह या शून्य में प्रतिरूपण करने की कोशिश कर रहा है या सेवा खाता प्रवाह का उपयोग नहीं कर रहा है।

निश्चित रूप से, एक संबंधित setServiceAccountUser (स्ट्रिंग) है जो उपयोगकर्ता के उपयोगकर्ता नाम (ईमेल पता) को स्वीकार करता है जिसका आप प्रतिरूपण करने के लिए सेवा खाते का उपयोग कर रहे हैं।

मैंने उस फ़ील्ड को उचित मूल्य पर सेट किया और मैं आगे बढ़ने में सक्षम था।

पीछे की ओर, यह सब समझ में आता है - अगर मैं उस खाते की आपूर्ति नहीं करता जिसे मैं काम करने की कोशिश कर रहा हूं, तो मैं उस खाते के संपर्कों को नीचे नहीं खींच सकता।

+0

हे बेनामी, उत्तर के लिए धन्यवाद। हालांकि आप किसी डोमेन पर कुंजी आधारित OAuth 2.0 पहुंच के लिए दृष्टिकोण का वर्णन कर रहे हैं। ऊपर वर्णित अनुसार यह मेरे लिए ठीक काम करता है। मैं वास्तव में जो खोज रहा हूं वह एक सामान्य उपयोगकर्ता के माध्यम से संपर्कों का उपयोग करने का एक समाधान है जैसे [email protected] - Google प्रबंधित डोमेन के बिना। मुझे आशा है कि उपरोक्त मेरा प्रश्न उस संबंध में समझ में आता है। –

0

वर्तमान में किसी सेवा खाते का उपयोग करके संपर्कों तक पहुंच बनाना संभव नहीं है क्योंकि यह Google API कंसोल में Google APIs Console पर समर्थित नहीं है।

यह भी देखें: Service Accounts

दूसरा, यह केवल एक Google डोमेन प्रबंधित के साथ काम करेगा क्योंकि डोमेन के व्यवस्थापक नीचे प्रक्रिया के माध्यम से सेवा खाते तक पहुंच देनी होंगी:

प्रतिनिधि डोमेन-व्यापी आपके सेवा खाते का अधिकार

आपके द्वारा बनाए गए सेवा खाते को अब Google Apps डोमेन के उपयोगकर्ता डेटा तक पहुंच प्रदान करने की आवश्यकता है जिसे आप एक्सेस करना चाहते हैं। निम्नलिखित कार्यों को Google Apps डोमेन के व्यवस्थापक द्वारा किया जाना चाहिए:

  1. अपने Google Apps डोमेन के नियंत्रण कक्ष पर जाएं। यूआरएल इस तरह दिखना चाहिए: "www.google.com/a/cpanel/mydomain.com"

  2. उन्नत टूल पर जाएं ...> तृतीय पक्ष OAuth क्लाइंट एक्सेस प्रबंधित करें।

  3. क्लाइंट नाम फ़ील्ड में सेवा खाता क्लाइंट आईडी दर्ज करें।

  4. एक या अधिक एपीआई स्कोप फ़ील्ड में उन क्षेत्रों की सूची दर्ज करें जिन्हें आपके एप्लिकेशन तक पहुंच प्रदान की जानी चाहिए।

  5. प्राधिकरण बटन पर क्लिक करें।

+0

यकीन नहीं है कि मैं सहमत हो सकता हूं। संपर्क API डोमेन के एपीआई कंसोल में उपलब्ध नहीं है - लेकिन यह डोमेन पर काम करता है। तो सैद्धांतिक रूप से यह नियमित जीमेल खातों पर भी काम करना चाहिए। और सेवा खातों के संबंध में - यह अवधारणा एकल खातों के लिए काम करती है। हमने कैलेंडर एपी और ड्राइव के साथ परीक्षण किया। और अंत में - वास्तव में अजीब चीज यह है कि हमें कोई विफलता संदेश नहीं मिलता है। हमें केवल कोई डेटा नहीं मिलता है। एक बग की तरह दिखता है? –

+0

मैंने इस उत्तर को खोजने से पहले इस दृष्टिकोण की कोशिश की लेकिन मेरे लिए यह काम नहीं करता है। मैं उपयोग कर रहा हूं - एक दायरे के रूप में - 'https: // www.google.com/m8/फ़ीड्स' (संपर्क आर/डब्ल्यू) लेकिन खुशी के बिना। मैंने देखा कि सेवाओं के लिए स्कोप "सुरक्षित" हो जाते हैं और यूआरआई के बगल में उनके मानव-अनुकूल नाम प्रदर्शित होते हैं, लेकिन यह उपर्युक्त के साथ नहीं होता है। मुझे संदेह है कि यह बस असमर्थित है। – mac

+0

@mac मेरे पास इस यूआरएल के साथ समान नहीं था। हालांकि यदि आप अंत में एक स्लैश जोड़ते हैं, तो यह पहचाना जाता है। (वास्तव में एपीआई को कॉल करने के साथ कोई भाग्य नहीं ...) – Geert

0

मैं आज यह बहुत ही गलती के पार चला गया है, लेकिन अब के लिए सेवा खाते का उपयोग करने पर छोड़ दिया है, जो मुझे लगता है वर्तमान में संपर्क API में समर्थित नहीं है। और इसलिए मैं OAuth 1.0 के साथ संपर्क API v3 का उपयोग कर रहा हूं और अपेक्षित परिणाम प्राप्त कर रहा हूं।

ContactsService contactsService = new ContactsService(APPLICATION_NAME); 
contactsService.setUserCredentials(CLIENT_USERNAME, CLIENT_SECRET); 

URL contactFeedURL = new URL("https://www.google.com/m8/feeds/contacts/default/full"); 
Query contactFeedQuery = new Query(contactFeedURL); 

ContactFeed contactFeed = contactsService.getFeed(contactFeedQuery, ContactFeed.class); 
+0

धन्यवाद :) जानना अच्छा है। OAuth 1.0 भी हमारे लिए काम कर रहा है। OAuth 2.0 अभी भी पी 12 प्रमाणपत्र के साथ काम नहीं करता है ... –

+0

उम्मीद है कि यह जल्द ही पर्याप्त समर्थित होगा। मुझे पता है कि इसने आपके प्रश्न का उत्तर नहीं दिया, लेकिन मैंने सोचा कि यह किसी के लिए उठने और संपर्कों के साथ चलने के लिए उपयोगी हो सकता है। – rposky