18

के माध्यम से एक सेवा खाते का उपयोग कर v3 Google कैलेंडर API को कॉल करते समय अनधिकृत संदेश सबसे पहले, मुझे बताएं कि मैं क्या करने की कोशिश कर रहा हूं, क्योंकि यह दो भाग प्रश्न है।"लॉगिन आवश्यक" 401 ओएथ 2.0

मैं एक जेएक्स-आरएस सेवा का निर्माण कर रहा हूं जो OAuth2 के माध्यम से Google खाते के साथ आंतरिक रूप से प्रमाणीकृत है, इसलिए यह Google कैलेंडर तक पहुंच और कुशलतापूर्वक उपयोग कर सकता है। इस सेवा को एक वेबसाइट (जूमला) द्वारा बुलाया जाएगा, जो उपयोगकर्ताओं को कैलेंडर ईवेंट के साथ अपना ईमेल पता पंजीकृत करने के लिए साइट पर लॉगिन करने की अनुमति देगा ताकि ईवेंट निकट होने पर ईमेल सूचनाएं प्राप्त कर सकें। इन उपयोगकर्ताओं को अंतर्निहित Google खाते का कोई ज्ञान नहीं है।

तो मेरा पहला सवाल, सेवा खाता प्रमाणीकरण सही चीज़ का उपयोग कर रहा है? Google दस्तावेज़ों को देखते हुए, इसका एकमात्र उपयोग केस जो गैर-मानव प्रमाणीकरण (इसलिए सर्वर प्रमाणीकरण के लिए सर्वर) को पूरा करता है।

दूसरी समस्या यह है कि मैंने ऐसा करने के लिए कुछ कोड लिखा है, लेकिन जब मैं निष्पादन विधि कैलेंडर फ़ीड को कॉल करता हूं तो मुझे निम्न त्रुटि वापस वापस 401/अनधिकृत प्रतिक्रिया मिलती है। यह कोड Google नमूने से हटा लिया गया था।

मैं Google कैलेंडर API के v3-rev3-1.5.0-beta का उपयोग कर रहा हूं। मैंने खाते में कैलेंडर एपीआई चालू कर दी है, और एक निजी कुंजी बनाई और डाउनलोड की है, जिसका उपयोग नीचे दिए गए कोड में किया जाता है।

मैं नीचे दिए गए कोड को स्थानीय रूप से ग्रहण में कॉल कर रहा हूं, वेब सर्वर से नहीं।

तो पहली कॉल मैं एक क्रेडेंशियल वस्तु वापस पाने के लिए है (ईद के एक्स के साथ अस्पष्ट):

private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport(); 
private static final JsonFactory JSON_FACTORY = new JacksonFactory(); 
. 
. 
. 
GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
      .setJsonFactory(JSON_FACTORY) 
      .setServiceAccountId("[email protected]") 
      .setServiceAccountScopes(CalendarScopes.CALENDAR) 
      .setServiceAccountPrivateKeyFromP12File(new File("D:/3cd8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXd635e-privatekey.p12")) 
      .build(); 

अगले कदम तो, कैलेंडर API कॉल करने के लिए इतना (कोई अन्य में कहा जाता है कोड की तरह है के बीच):

Calendar calendar = Calendar.builder(HTTP_TRANSPORT, JSON_FACTORY) 
     .setApplicationName("TestApp-Calendar/1.0").setHttpRequestInitializer(credential) 
     .build(); 

CalendarList feed = calendar.calendarList().list().execute(); 

कॉल() सूची निम्न त्रुटि में निष्पादित() परिणाम:।

com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized { "code" : 401, "errors" : [ { "domain" : "global", "location" : "Authorization", "locationType" : "header", "message" : "Login Required", "reason" : "required" } ], "message" : "Login Required" } at com.google.api.client.googleapis.json.GoogleJsonResponseException.from(GoogleJsonResponseException.java:159) at com.google.api.client.googleapis.json.GoogleJsonResponseException.execute(GoogleJsonResponseException.java:187) at com.google.api.client.googleapis.services.GoogleClient.executeUnparsed(GoogleClient.java:115) at com.google.api.client.http.json.JsonHttpRequest.executeUnparsed(JsonHttpRequest.java:112) at com.google.api.services.calendar.Calendar$CalendarList$List.execute(Calendar.java:510) at uk.org.reigatepriorybowmen.Service.registerEmailForAllCalendarEvents(Service.java:55) at uk.org.reigatepriorybowmen.Service.main(Service.java:74)

सेवा खाता स्थापना इस प्रकार है:

enter image description here

तो, क्या मैं गलत कर रहा हूँ ?! मैंने समाधानों की तलाश में घूमने के घंटों बिताए हैं, इसलिए यह मेरी आखिरी उम्मीद है।

आपकी सहायता के लिए अग्रिम धन्यवाद।

जस्टिन

+1

क्या आपको कभी भी इसका समाधान मिलना चाहिए? –

उत्तर

1

मुझे लगता है कि आप उपयोगकर्ता है कि आप प्रतिरूपित करने के लिए कोशिश कर रहे हैं निर्दिष्ट करने के लिए की आवश्यकता होगी।

जिस तरह से आप ServiceAccount का उपयोग कर रहे हैं, वह अभी आपके आवेदन से संबंधित डेटा या अपने सेवा खाते तक पहुंचने के लिए मान्य है। चूंकि आप Google कैलेंडर डेटा तक पहुंच बनाना चाहते हैं, इसलिए आपको अपने किसी भी डोमेन उपयोगकर्ता के डेटा तक पहुंचने के लिए विशेषाधिकारों वाला Google Apps डोमेन व्यवस्थापक होना चाहिए - अगर मैं सही नहीं हूं तो मुझे बताएं। Google कैलेंडर डेटा उपयोगकर्ताओं से संबंधित है, इसलिए आपको यह निर्दिष्ट करने की आवश्यकता है कि आप किस उपयोगकर्ता का प्रतिरूपण करने का प्रयास कर रहे हैं।

जावा का उपयोग कर ऐसा करने के लिए, ऐसा लगता है कि आप उपयोग GoogleCredential.Builder#setServiceAccountUser(String)

क्या करने की जरूरत प्रयास करें: (एक बार आप अपने एपीआई परियोजना में एक सेवा खाता कुंजी बनाया है से

GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
     .setJsonFactory(JSON_FACTORY) 
     .setServiceAccountId("[email protected]") 
     .setServiceAccountScopes(CalendarScopes.CALENDAR) 
     .setServiceAccountPrivateKeyFromP12File(new File("/path/to/privatekey.p12")) 
     .setServiceAccountUser("[email protected]") 
     .build(); 

इसके अलावा, एपीआई कंसोल), आपको इस परियोजना को सीपीनल में अधिकृत तृतीय पक्ष ऐप की सूची में जोड़ना होगा। इसके बारे में अधिक जानकारी here मिल सकती है। "क्लाइंट आईडी" जिसे आप उपयोग करना चाहते हैं वह सेवा खाता कुंजी से जुड़ा हुआ है और <APP_ID>-<OTHER_KEY>.apps.googleusercontent.com

+0

हाय, धन्यवाद, मैं इसे एक भंवर दूंगा और अगर यह काम करता है तो वापस पोस्ट करें। मैंने इस परियोजना को छोड़ दिया है लेकिन मैं अभी भी जानना चाहता हूं कि यह भविष्य के संदर्भ के लिए कैसे काम कर रहा है। –

+0

ठीक है मैंने setServiceAccountUser() विधि को कॉल करने का प्रयास किया है और मुझे एक ही त्रुटि मिलती है। मुझे विश्वास नहीं है कि Google ने इसका उपयोग करना इतना कठिन बना दिया है! –

+0

आपको अपने डोमेन में क्लाइंट आईडी को श्वेतसूची में भी लिखना होगा; सीपीनल। मैंने जोड़ा है कि यह मेरे जवाब में कैसे करता है। मैं सहमत हूं कि 2-लीग ओथ 1 मेरी राय में थोड़ा सा सरल था। HOpe हम OAuth 2.0 के साथ एक दिन से कुछ आसान प्राप्त कर सकते हैं ... – Nivco

1

ऐसा व्यवहार तब हो सकता है जब आपने व्यवस्थापक पैनल में एपीआई उपयोगकर्ता नहीं जोड़ा है (आपके मामले में दस्तावेज़ पैनल मुझे लगता है) उदाहरण के लिए Google एनालिटिक्स में आपको नया उपयोगकर्ता जोड़ना होगा जहां ईमेल पता वही है जो आपको एपीआई से मिलता है (निजी एपीआई बनाने के बाद, Google API सेवा खाते द्वारा प्रदान किया जाता है)। एनालिटिक्स में यह इस तरह दिखता है:

example in google analytics

+0

हाय, धन्यवाद, मैं इसे एक भंवर दूंगा और अगर यह काम करता है तो वापस पोस्ट करें। मैंने इस परियोजना को छोड़ दिया है लेकिन मैं अभी भी जानना चाहता हूं कि यह भविष्य के संदर्भ के लिए कैसे काम कर रहा है। –

+0

मैं नहीं देख सकता कि उपयोगकर्ता एपीआई कंसोल में कहां सेट हैं। –

+0

यह एक एपीआई कंसोल नहीं है जो Google Analytics पैनल के अंदर है। यहां एक सरल मार्गदर्शिका है: [link] (http://www.pimcore.org/wiki/display/PIMCORE/Setup+Google+Analytics+Reporting+with+OAuth2+Service+Accounts+ (+ 1.4.6 के बाद से))) –

5

401 का सवाल है, यह गूगल के एपीआई के साथ कुछ विषमता लगता है। मुझे पहली बार लगता है कि मैं थोड़ी देर में अपना ऐप चलाता हूं, और फिर यादृच्छिक अंतराल घंटों में अलग-अलग फैलता है, मुझे हमेशा 401 मिलते हैं। दूसरे या तीसरे दौर में यह वास्तव में लॉग इन करता है।

व्यवहार भी इसके लिए जिम्मेदार है Google के कार्य API नमूना कोड here में।

सूचना इस कोड:

void onRequestCompleted() { 
received401 = false; 
} 

void handleGoogleException(IOException e) { 
if (e instanceof GoogleJsonResponseException) { 
    GoogleJsonResponseException exception = (GoogleJsonResponseException) e; 
    if (exception.getStatusCode() == 401 && !received401) { 
    received401 = true; 
    accountManager.invalidateAuthToken(credential.getAccessToken()); 
    credential.setAccessToken(null); 
    SharedPreferences.Editor editor2 = settings.edit(); 
    editor2.remove(PREF_AUTH_TOKEN); 
    editor2.commit(); 
    gotAccount(); 
    return; 
    } 
} 
Log.e(TAG, e.getMessage(), e); 

}

Google की अपनी कोड नमूने में वे पहली बार 401 यह कुछ विशेष सुरक्षा समस्या की जरूरत है कि कोड में नियंत्रित किया जा करने के लिए किया जा सकता है के लिए प्रावधान कर दिया है।

0

ठीक है, इसलिए मैं इसके साथ खेल रहा हूं और 401 त्रुटि को पीछे छोड़ दिया है, लेकिन अब मैं 403 मार रहा हूं। हालांकि, मैं उस कोड का विस्तार करूंगा जो मैंने लिखा है कि कम से कम 401 समस्या का उत्तर दें।

मैंने सेवा की किसी भी सेटिंग में बदलाव नहीं किया है या किसी भी कुंजी को पुन: उत्पन्न नहीं किया है, यह वही है।

कुछ कोड में परिवर्तन क्या है, और मैंने कैलेंडर API के v3r20lv1.12.0-beta में अपग्रेड किया।

नीचे कोड, के रूप में ओपी में ऊपर विस्तृत, एक ही है, यानी रहता है:

private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport(); 
private static final JsonFactory JSON_FACTORY = new JacksonFactory(); 
. 
. 
. 
GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT) 
     .setJsonFactory(JSON_FACTORY) 
     .setServiceAccountId("[email protected]") 
     .setServiceAccountScopes(CalendarScopes.CALENDAR) 
     .setServiceAccountPrivateKeyFromP12File(new File("D:/3cd8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXd635e-privatekey.p12")) 
     .build(); 

कैलेंडर के लिए एक संभाल पाने के लिए कोड बदल गया है, लेकिन यह एक API परिवर्तन से मजबूर किया गया था:

Calendar calendar = new Calendar(HTTP_TRANSPORT, JSON_FACTORY, credential); 

इस बिंदु पर, मैं अपने कैलेंडर के माध्यम से पुनरावृति और घटनाओं को देखते हैं, निम्नलिखित कोड (इस एक घटना सारांश प्रिंट) चलाकर कर सकते हैं:

Events events = calendar.events().list(CALENDAR_ID).execute(); 

for (Event event : events.getItems()) 
{ 
    System.out.println(event.getSummary()); 
} 

लेकिन, यदि मैं किसी ईवेंट को आज़माता और अपडेट करता हूं, तो मुझे 403 निषिद्ध त्रुटि मिलती है। मैं इसके लिए एक अलग धागा उठाऊंगा, और दोनों धागे को एक साथ जोड़ दूंगा।

आपकी मदद के लिए सभी को धन्यवाद!

संपादित करें: here नया धागा है।

1

मैं एक एंड्रॉइड मोबाइल ऐप डेवलपर हूं। मैं Google कैलेंडर API (OAuth 2.0) का उपयोग कर एक एप्लिकेशन बना रहा हूं। मुझे भी यही त्रुटि का सामना करना पड़ा। लेकिन अब, मैंने त्रुटि का समाधान किया है। मैं इसके लिए परिदृश्य और समाधान लिख रहा हूं।
विशेष कैलेंडर के लिए (मोबाइल एप्लिकेशन एपीआई) कैलेंडर इवेंट होने का यूआरएल:

https://www.googleapis.com/calendar/v3/calendars/en.indian%23holiday%40group.v.calendar.google.com/events?access_token=ya29.AHES6ZQyP3iDZM8PF-7ZqZE8oKmWAgUX55sPGPTjGbM5A 

इस यूआरएल में, हम calendarId जोड़ने के लिए। यूआरएल का प्रारूप है;

https://www.googleapis.com/calendar/v3/calendars/<calendarId>/events 

मैं url में जोड़ने से पहले कैलेंडर को एन्कोड नहीं कर रहा था। मैंने कैलेंडर आईडी को एन्कोड किया और फिर एचटीपी अनुरोध किया। सब ठीक हो गया।

final String accessToken=dataStore.getAccessToken(); 

    List<NameValuePair> params = new LinkedList<NameValuePair>(); 
    params.add(new BasicNameValuePair("access_token", accessToken)); 
    String paramString = URLEncodedUtils.format(params, "utf-8"); 

    final String url = String.format(AuthConstants.CALENDAR_EVENTS_URI,URLEncoder.encode(calendarId))+"?"+ paramString; 

अब जेएसओएन में कैलेंडर ईवेंट लौटाए जाते हैं।

0

क्या आपने उचित क्षेत्रों के लिए अनुमति का अनुरोध किया था? आपको हमेशा https://www.googleapis.com/auth/userinfo.profile

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

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