6

संपादित करें: मूल रूप से इस प्रश्न से पूछा गया कि मैं केवल मेरी एपीआई कुंजी का उपयोग करके Google Analytics API के साथ प्रमाणित कैसे कर सकता हूं। vlatko pointed out के रूप में, यह संभव नहीं है। अब मैं ओएथ 2 को काम करने के लिए ध्यान केंद्रित कर रहा हूं। जब मुझे मौका मिलता है तो मैं vlatko के सुझावों का प्रयास करूँगा और सवाल अपडेट करूँगा। इस बीच, आप जो कुछ भी सोच रहे हैं उसके साथ उत्तर देने में स्वतंत्र महसूस करें।Google Analytics 3.0 auth flow


मूल प्रश्न:

मैं गूगल विश्लेषिकी एपीआई के अनुरोध करने के लिए कोशिश कर रहा हूँ। मैं चरणों को दोहराने की कोशिश कर रहे Hello Analytics ट्यूटोरियल के माध्यम से चल रहा हूं। जो कुछ भी मैं कोशिश करता हूं, मैं सफलतापूर्वक प्रमाणित नहीं कर सकता।

ट्यूटोरियल कहते हैं निम्नलिखित:

ओपन फाइल आप HelloAnalyticsApi.java नामित और बनाया निम्न विधि जोड़ें:

private static Analytics initializeAnalytics() throws Exception { 
    // Authorization. 
    Credential credential = OAuth2Native.authorize(
     HTTP_TRANSPORT, JSON_FACTORY, new LocalServerReceiver(), 
     Arrays.asList(AnalyticsScopes.ANALYTICS_READONLY)); 

    // Set up and return Google Analytics API client. 
    return Analytics.builder(HTTP_TRANSPORT, JSON_FACTORY) 
     .setApplicationName("Google-Analytics-Hello-Analytics-API-Sample") 
     .setHttpRequestInitializer(credential) 
     .build(); 
    } 

एक उपयोगकर्ता इस स्क्रिप्ट का सामना करना पड़ता है, आवेदन करने का प्रयास करेंगे डिफ़ॉल्ट ब्राउज़र खोलें और उपयोगकर्ता को google.com पर होस्ट किए गए यूआरएल पर नेविगेट करें। इस बिंदु पर, उपयोगकर्ता को लॉगिन करने के लिए कहा जाएगा और एप्लिकेशन को उनके डेटा तक पहुंच प्रदान करेगा। एक बार दिया गया, एप्लिकेशन ब्राउज़र विंडो से कोड पढ़ने का प्रयास करेगा, फिर विंडो बंद करें।

अंतर यह है कि मैं इसे सर्वलेट एप्लिकेशन के साथ करने की कोशिश कर रहा हूं, और मैं एक एपीआई कुंजी (ओएथ 2.0 क्लाइंट आईडी की बजाय) के साथ सरल एपीआई एक्सेस का उपयोग करना चाहता हूं। मुझे पता है कि OAuth 2.0 की अनुशंसा की जाती है, लेकिन मुझे केवल उस डेटा तक पहुंचने की आवश्यकता है जो मेरे पास है और तकनीकी आवश्यकताओं को सरल बनाना चाहता है। मैंने इस निर्णय को this page पर आधारित किया है, जो कहता है:

एक एपीआई कुंजी एक अनूठी कुंजी है जिसे आप कंसोल का उपयोग करके उत्पन्न करते हैं। जब आपके एप्लिकेशन को इस प्रोजेक्ट में सक्षम एपीआई को कॉल करने की आवश्यकता है, एप्लिकेशन इस एपीआई अनुरोधों को key={API_key} पैरामीटर के रूप में पास करता है। इस कुंजी के उपयोग के लिए किसी भी उपयोगकर्ता कार्रवाई या सहमति की आवश्यकता नहीं है, किसी भी खाते की जानकारी तक पहुंच प्रदान नहीं करता है, और प्राधिकरण के लिए उपयोग नहीं किया जाता है।

यदि आप केवल उन एपीआई को कॉल कर रहे हैं जिन्हें उपयोगकर्ता डेटा की आवश्यकता नहीं है, जैसे Google कस्टम सर्च एपीआई, तो एपीआई कुंजी लागू करने के लिए सरल हो सकती है। हालांकि, यदि आपका एप्लिकेशन पहले से ही OAuth 2.0 एक्सेस टोकन का उपयोग करता है, तो एपीआई कुंजी भी उत्पन्न करने की आवश्यकता नहीं है। तथ्य में, Google OAuth 2.0 एक्सेस टोकन संबंधित प्रोजेक्ट से पहले से जुड़ा हुआ है, तो Google एपीआई कुंजी पारित करता है।

मैं प्रमाणन प्रवाह के कई कोड उदाहरण सिर्फ API कुंजी का उपयोग नहीं कर पा सकते हैं - सबसे सब कुछ मैंने डाउनलोड .p12 फ़ाइल के साथ ग्राहक आईडी, उदाहरण के लिए GoogleCredential जावाडोक का उपयोग कर पाया शो है। एक उदाहरण एप्लिकेशन जो मैं पा सकता था वह Google का Books Sample ऐप था।वैसे भी, यहाँ मैं क्या करने की कोशिश की (जो प्रबंधन एपीआई से खातों की सूची हो जाता है ट्यूटोरियल में पहली अनुरोध, नकल उतार) है:

Analytics analytics = 
     new Analytics.Builder(httpTransport, jsonFactory, null) 
     .setApplicationName("Dev API Access") 
     .build(); 
Management.Accounts.List list = 
     analytics.management().accounts().list().setKey(apiKey); 
Accounts accounts = list.execute(); 

कहाँ "देव एपीआई पहुँच" मेरे एपीआई में "नाम" फ़ील्ड है कंसोल डैशबोर्ड। एपीआई कुंजी एक सर्वर कुंजी है जो मेरे आईपी पते तक सीमित है। यह निम्न प्रतिक्रिया के साथ विफल रहता है:

Analytics analytics = 
     new Analytics.Builder(httpTransport, jsonFactory, null) 
     .setApplicationName("Dev API Access") 
     .setGoogleClientRequestInitializer(new AnalyticsRequestInitializer(apiKey)) 
     .build(); 

Management.Accounts.List list = analytics.management().accounts().list(); 
Accounts accounts = list.execute(); 

कौन सा एक ही त्रुटि दिखाता है:

401 Unauthorized 
{ 
    "code": 401, 
    "errors": [ 
    { 
     "domain": "global", 
     "location": "Authorization", 
     "locationType": "header", 
     "message": "Login Required", 
     "reason": "required" 
    } 
    ], 
    "message": "Login Required" 
} 

मैं भी इस की कोशिश की। मुझसे यहां क्या गलत हो रहा है? क्या AAuth2 को एनालिटिक्स कॉल के लिए आवश्यक है? यदि हां, तो पुस्तकें नमूना ऐप में केवल एपीआई कुंजी का उपयोग क्यों कर रहा है?


आगे बढ़ते, मैं आगे चला गया और वैसे भी OAuth2 की कोशिश की - मैं एक ग्राहक आईडी बनाई और .p12 निजी कुंजी फ़ाइल डाउनलोड किया। लेकिन मैं इसे काम नहीं कर सका। यहाँ मैं क्या करने की कोशिश की है:

Credential credential = 
     new GoogleCredential.Builder() 
     .setTransport(httpTransport) 
     .setJsonFactory(jsonFactory) 
     .setServiceAccountId(serviceAccountId) 
     .setServiceAccountScopes(AnalyticsScopes.ANALYTICS_READONLY) 
     .setServiceAccountPrivateKeyFromP12File(new File(p12FilePath)) 
     .setServiceAccountUser(serviceAccountUser) 
     .build(); 

Analytics analytics = 
     new Analytics.Builder(httpTransport, jsonFactory, credential) 
     .setApplicationName("Dev API Access") 
     .build(); 

Management.Accounts.List list = analytics.management().accounts().list(); 
Accounts accounts = list.execute(); 

कहाँ serviceAccountId परियोजना और serviceAccountUser मालिक गूगल खाते का ईमेल पता है उत्पन्न ग्राहक आईडी पर सूचीबद्ध ईमेल पता है। यह निम्नलिखित के साथ विफल:

400 Bad Request 
{ 
    "error": "invalid_grant" 
} 

"अवैध अनुदान" का क्या मतलब है, और कैसे मैं सफलतापूर्वक प्रमाणित करते हैं (आदर्श OAuth2 के बिना)?

उत्तर

3

अपने पहले प्रश्न का उत्तर देने के लिए: सामान्य रूप से, OAuth2.0 का उपयोग उपयोगकर्ता के निजी डेटा तक अधिकृत पहुंच के लिए किया जाता है, इसलिए उपयोगकर्ता सहमति प्राप्त करने और पहुंच टोकन प्राप्त करने की आवश्यकता होती है। हालांकि, Google पुस्तकें API के मामले में, यदि आप सार्वजनिक डेटा तक पहुंच रहे हैं, तो अंतिम उपयोगकर्ता सहमति की कोई आवश्यकता नहीं है, इसलिए एपीआई कुंजी पर्याप्त है। यदि आप पुस्तकें API के साथ गैर सार्वजनिक डेटा तक पहुंचने का प्रयास करते हैं, तो आपको अभी भी एक OAuth2 टोकन की आवश्यकता होगी।

आपके मामले के लिए अच्छी खबर यह है कि ओएथ 2 के साथ भी, आप उपयोगकर्ता भागीदारी को बाईपास कर सकते हैं और सेवा खातों के साथ अपने प्रवाह को व्यवस्थित कर सकते हैं - मानते हैं कि आपके एप्लिकेशन को एपीआई तक पहुंच है। Analytics API के लिए इसे सेट अप करने का एक तरीका है, here समझाया गया है (सेवा लेखा अनुभाग में चरणों की जांच करें)। मुझे लगता है कि आप अपने Credential निर्माता के साथ सही रास्ते पर हैं, लेकिन मुझे नहीं लगता कि आपको वहां सेवा खाता उपयोगकर्ता सेट करने की आवश्यकता है, क्योंकि आप कोई उपयोगकर्ता प्रतिरूपण नहीं कर रहे हैं।

+0

+1 एपीआई कुंजी के बारे में स्पष्टीकरण के लिए धन्यवाद। मैंने संदर्भ के रूप में इसका उपयोग करते समय पुस्तकें API के बारे में गलत धारणाएं की हैं। मैं केवल OAuth2 मुद्दे पर ध्यान केंद्रित करने के लिए प्रश्न अपडेट करूंगा। अभी तक आपके लिंक की जांच करने का मौका नहीं मिला है। –

+0

यह काम कर रहा है - आपकी मदद के लिए धन्यवाद! विवरण के लिए नीचे मेरा जवाब देखें। –

3

vlatko's answer मुझे सही रास्ते पर मिला। मुद्दा यह साबित हुआ कि मैं सेवा खाता ईमेल पते के साथ मालिक ईमेल पते को भ्रमित कर रहा था।

Credential credential = 
    new GoogleCredential.Builder() 
    .setTransport(httpTransport) 
    .setJsonFactory(jsonFactory) 
    .setServiceAccountId("[email protected]")     //wrong 
    .setServiceAccountScopes(AnalyticsScopes.ANALYTICS_READONLY) 
    .setServiceAccountPrivateKeyFromP12File(new File(p12FilePath)) 
    .setServiceAccountUser("[email protected]") //unnecessary 
    .build(); 

जब मैं यह करने के लिए की जरूरत है: उदाहरण के लिए, मैं निम्नलिखित कर रहा था मेरे Analytics आवेदन पर एक उपयोगकर्ता के रूप

Credential credential = 
    new GoogleCredential.Builder() 
    .setTransport(httpTransport) 
    .setJsonFactory(jsonFactory) 
    .setServiceAccountId("[email protected]") 
    .setServiceAccountScopes(AnalyticsScopes.ANALYTICS_READONLY) 
    .setServiceAccountPrivateKeyFromP12File(new File(p12FilePath)) 
    .build(); 

इसके अलावा, मैं जोड़ा था [email protected] - यह इसी तरह से होने की जरूरत इसके बजाय सेवा खाता ईमेल।