2012-03-02 18 views
6

का उपयोग कर Google API के साथ प्रमाणीकरण मैं अब कुछ दिनों से इसके साथ संघर्ष कर रहा हूं। मैं Android के AccountManager के माध्यम से प्रमाणीकरण का उपयोग करके Google कैलेंडर पर कॉल करने का प्रयास कर रहा हूं। मैं सामान्य विधि का उपयोग कर एक प्रमाणीकरण टोकन पुनः प्राप्त:खाता प्रबंधक

AccountManager manager = AccountManager.get(this); 
String authToken = manager.getAuthToken(account, AUTH_TOKEN_TYPE, true, null, null).getResult().getString(AccountManager.KEY_AUTHTOKEN); 

और फिर, कि टोकन के माध्यम से, मैं इस तरह एक Calendar उदाहरण बनाने के लिए:

HttpTransport transport = AndroidHttp.newCompatibleTransport(); 
JacksonFactory jsonFactory = new JacksonFactory(); 
GoogleAccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource(accessToken); 
Calendar calendar = Calendar.builder(transport, jsonFactory).setApplicationName("MyApp/1.0").setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() { 
    @Override 
    public void initialize(JsonHttpRequest request) { 
     CalendarRequest calendarRequest = (CalendarRequest) request; 
     calendarRequest.setKey(API_KEY); 
    } 
}).setHttpRequestInitializer(accessProtectedResource).build(); 

हालांकि, जब मैं इस का उपयोग कर API कॉल करने, मैं नीचे देखी गई 401 Unauthorized त्रुटि प्राप्त करें। ध्यान दें कि मैंने कालबाह्य लेख टोकन को अमान्य करने के लिए कोड शामिल किया है, इसलिए मुझे विश्वास नहीं है कि यह समस्या है।

com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized 
{ 
    "code" : 401, 
    "errors" : [ { 
     "domain" : "global", 
     "location" : "Authorization", 
     "locationType" : "header", 
     "message" : "Invalid Credentials", 
     "reason" : "authError" 
    } ], 
    "message" : "Invalid Credentials" 
} 

कोई विचार क्या मैं गलत कर रहा हूं?

उत्तर

11

हाँ यह संभव है। एक बार जब आपके पास Google खाते (जैसे आपने वर्णित) पर एक संभाल लिया है, तो आपको GData सेवा के लिए खाता प्रबंधक से ऑथ टोकन का अनुरोध करने की आवश्यकता है।

यदि एंड्रॉइड डिवाइस में पहले से ही एक ऑथ टोकन है (विशेष GData सेवा के लिए आप एक्सेस करने का प्रयास कर रहे हैं), तो यह आपको वापस कर दिया जाएगा। यदि नहीं, तो खाता प्रबंधक एक का अनुरोध करेगा और आपको वापस कर देगा। किसी भी तरह से, आपको इसके बारे में चिंता करने की आवश्यकता नहीं है क्योंकि खाता प्रबंधक इसे संभालता है।

निम्न उदाहरण में, मैं Google Spreadsheets एपीआई का उपयोग कर रहा हूँ:

ArrayList<Account> googleAccounts = new ArrayList<Account>(); 

// Get all accounts 
Account[] accounts = accountManager.getAccounts(); 
    for(Account account : accounts) { 
    // Filter out the Google accounts 
    if(account.type.compareToIgnoreCase("com.google")) { 
     googleAccounts.add(account); 
    } 
    } 
AccountManager accountManager = AccountManager.get(activity); 

// Just for the example, I am using the first google account returned. 
Account account = googleAccounts.get(0); 

// "wise" = Google Spreadheets 
AccountManagerFuture<Bundle> amf = accountManager.getAuthToken(account, "wise", null, activity, null, null); 

try { 
    Bundle authTokenBundle = amf.getResult(); 
    String authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN); 

    // do something with the token 
    InputStream response = sgc.getFeedAsStream(feedUrl, authToken, null, "2.1"); 

} 

और

कृपया Google डेटा API में sample code पर एक नजर है। प्रमाणीकरण के बाद करना महत्वपूर्ण बात है GoogleHeaders.setGoogleLogin (स्ट्रिंग) को कॉल करना।

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

ठीक है, मैं वर्तमान में 'setGoogleLogin() 'को कॉल नहीं कर रहा हूं, लेकिन मैं नमूना कोड देख रहा हूं जो' ((GoogleHeaders) transport.defaultHeaders) .setGoogleLogin (authToken)' कहता है, लेकिन यह भी नहीं है मेरे लिए संकलन करें। मैं google-http-client-1.6.0-beta का उपयोग कर रहा हूं। 'HttpTransport' में अब' डिफ़ॉल्ट हेडर 'फ़ील्ड नहीं दिखता है। –

0

खुद को एक ही मुद्दे में चलाएं। मैंने पाया मैं अज्ञात कुंजी सूची में xoauth_requestor_id (संदर्भ: http://www.yenlo.nl/2011/google-calendar-api-v3-and-2lo/) निर्धारित करने की आवश्यकता है कि

यह मेरे लिए काम किया:

com.google.api.services.calendar.Calendar.CalendarList.List list = calendar.calendarList().list(); 
//Set the requestor id 
list.getUnknownKeys().put("xoauth_requestor_id", "[email protected]"); 

इस API कॉल के बाद के माध्यम से चला गया।

मेरी इच्छा है कि अनुरोधकर्ता आईडी की आवश्यकता क्यों है, इस बारे में एक स्पष्टीकरण था। क्या कोई समझा सकता है?

+0

बस कोशिश की, लेकिन मुझे अभी भी '401 अनधिकृत' त्रुटि दुर्भाग्य से मिल रही है। –

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