2013-03-05 11 views
8

मैं followin कोड का उपयोग कर रहा एक पहुंच टोकन प्राप्त करने, गूगल + को जोड़ने के बाद, प्रोफ़ाइल जानकारी और ई-मेल प्राप्त करने के लिए:गूगल प्लस एंड्रॉयड के लिए: अमान्य साख

String sAccessToken = GoogleAuthUtil.getToken(this,mPlusClient.getAccountName() + "", 
          "oauth2:" + Scopes.PLUS_PROFILE + " 
          https://www.googleapis.com/auth/userinfo.profile 
          https://www.googleapis.com/auth/userinfo.email"); 

यह पहुंच टोकन मैं भंडारण नहीं कर रहा हूँ और फिर से उपयोग करने की कोशिश कर रहा है। इसके बजाय मैं हर बार एक एक्सेस टोकन मांगता हूं, एक नया (अलग) टोकन की अपेक्षा करता हूं, ताकि मुझे यह जांचने की आवश्यकता न हो कि इसकी अवधि समाप्त हो गई है या नहीं।

लेकिन मुझे हर बार जब मैं पूछता हूं तो मुझे एक ही एक्सेस टोकन मिल रहा है। मैंने ऐप को अनइंस्टॉल किया, Google+ ऐप का डेटा साफ़ कर दिया और फिर भी मुझे एक ही एक्सेस टोकन मिल गया। "message": "Invalid Credentials"

{ 
"error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "authError", 
    "message": "Invalid Credentials", 
    "locationType": "header", 
    "location": "Authorization" 
    } 
    ], 
    "code": 401, 
    "message": "Invalid Credentials" 
} 
} 

यह ब्राउज़र पर एक प्रतिक्रिया है -

वास्तविक समस्या, इस पहुंच टोकन का उपयोग कर एक 401 त्रुटि देता है।

एक डिवाइस पर मैं Logcat में यह मिलता है:

02-25 02:09:46.919: W/System.err(3022): java.io.FileNotFoundException: https://www.googleapis.com/oauth2/v1/userinfo 
02-25 02:09:46.929: W/System.err(3022):  at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:521) 
02-25 02:09:46.929: W/System.err(3022):  at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:258) 
02-25 02:09:46.929: W/System.err(3022):  at com.example.gmaillogin.MainActivity$connectAsyncTask.doInBackground(MainActivity.java:269) 
02-25 02:09:46.929: W/System.err(3022):  at com.example.gmaillogin.MainActivity$connectAsyncTask.doInBackground(MainActivity.java:1) 
02-25 02:09:46.929: W/System.err(3022):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
02-25 02:09:46.929: W/System.err(3022):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
02-25 02:09:46.929: W/System.err(3022):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
02-25 02:09:46.929: W/System.err(3022):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
02-25 02:09:46.929: W/System.err(3022):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
02-25 02:09:46.929: W/System.err(3022):  at java.lang.Thread.run(Thread.java:1019) 

लाइन 269:

urlConnection = (HttpURLConnection) url.openConnection(); 

पूरा कोड:

URL url = new URL("https://www.googleapis.com/oauth2/v1/userinfo"); 
String sAccessToken = GoogleAuthUtil.getToken(
         MainActivity.this, 
         mPlusClient.getAccountName() + "", 
         "oauth2:" + Scopes.PLUS_PROFILE + " 
              https://www.googleapis.com/auth/userinfo.profile 
              https://www.googleapis.com/auth/userinfo.email"); 

      Log.d("sAccessToken = ", "" + sAccessToken); 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setRequestProperty("Authorization", "Bearer " 
        + sAccessToken); 

      BufferedReader r = new BufferedReader(new InputStreamReader(
        urlConnection.getInputStream(), "UTF-8")); 
      StringBuilder total = new StringBuilder(); 
      String line; 
      while ((line = r.readLine()) != null) { 
       total.append(line); 
      } 
      line = total.toString(); 

संपादित करें:

यह निश्चित रूप से, क्योंकि पहुँच टोकन समाप्त हो जाता है। जिसकी उम्मीद थी, लेकिन मैंने सोचा कि जब भी मैं कॉल करता हूं तो मुझे एक नया एक्सेस टोकन मिलेगा।

लेकिन जैसे कहा here:

Android डिवाइस पहले से ही प्रमाणीकरण टोकन (विशेष रूप से GData सेवा आप पहुँचने का प्रयास कर रहे हैं के लिए) है, यह आप के लिए

लौटा दी जाएगी

तो, मैं यह करने के लिए है:

if (server indicates token is invalid) { 
       // invalidate the token that we found is bad so that GoogleAuthUtil won't 
       // return it next time (it may have cached it) 
       GoogleAuthUtil.invalidateToken(Context, String)(context, token); 
       // consider retrying getAndUseTokenBlocking() once more 
       return; 
      } 

docs की तरह कहते हैं कि

लेकिन मैं कैसे जांच सकता हूं कि एक्सेस टोकन समाप्त हो गया है या अमान्य है?

अपवाद को पकड़ने तक - एकमात्र समाधान है?

वास्तव में अपवाद java.io.FileNotFoundException जो मतलब नहीं है है।

+0

पर कोई विवरण है क्या आप प्लस क्लाइंट पर प्रदत्त विधियों का उपयोग करने के बजाय मैन्युअल रूप से ऐसा करने का प्रयास कर रहे हैं? ग्राहक को आपके ऐप की तरफ से टोकन एक्सचेंजों को स्वचालित रूप से संभालना चाहिए। – BrettJ

+0

मैं पीछा [इस] (https://developers.google.com/+/mobile/android/people#retrieve_an_authenticated_users_email_address) पहुँच टोकन प्राप्त करने के। दूसरी तरफ जहां यह स्वचालित रूप से संभाला जाता है? –

उत्तर

4

यहां आधारों को कवर करना: क्या आपने register a Google APIs Console project और अपने एंड्रॉइड ऐप के लिए ओएथ 2.0 क्लाइंट आईडी बनाया है, अपने ऐप के पैकेज नाम और अपने प्रमाण पत्र के SHA-1 फिंगरप्रिंट (टेस्ट या प्रोड) को निर्दिष्ट करके?

अक्सर 401 अमान्य क्रेडेंशियल्स संदेश API कंसोल प्रोजेक्ट कॉन्फ़िगर नहीं किया जा रहा है या सेटिंग में से एक अवैध होने के कारण है।

गूगल + एसडीके के लिए विशेष रूप कि सेट अप प्रक्रिया से गुजरने के लिए चरणों यहां हैं: https://developers.google.com/+/mobile/android/getting-started

संपादित

PlusClient आपके लिए आपकी टोकन संभाल कर सकते हैं। मैं उन विधियों का उपयोग करने का सुझाव दूंगा जो PlusClient क्लाइंट को मैन्युअल रूप से करने के बजाए टोकन प्रबंधित करने की अनुमति देता है और अनुमति देता है। आप ईमेल या प्रोफ़ाइल डेटा की जरूरत है के माध्यम से PlusClienthttps://developers.google.com/+/mobile/android/people

+1

हाँ, मैंने जवाब में जो कुछ भी बताया है मैंने किया है। कुछ शोध के बाद मुझे निश्चित रूप से 'एक्सेस टोकन' की वजह से पता चला। ** वहाँ है कि क्या एक पहुँच टोकन समाप्त या मान्य है की जाँच करने के लिए एक तरीका है? ** –

+0

कैसे सत्यापित करें/टोकन मान्य तो वे न केवल वैध लेकिन यह भी इस दिए गए उपयोगकर्ता और एप्लिकेशन के लिए मान्य हैं के बारे में कुछ कोड के लिए त्वरित प्रारंभ नमूने देखें। जावा सर्वर साइड एप्लिकेशन सत्यापन लाइन 140 से शुरू होने वाले देखा जा सकता है: https://github.com/googleplus/gplus-quickstart-java/blob/master/src/com/google/plus/samples/quickstart/Signin.java # L141 – BrettJ

+0

अरे @BrettJ, यह मेरे लिए काम करता था, लेकिन केवल कुछ दिन पहले यह काम करना बंद कर और अब यह इस त्रुटि com.google.android.gms.auth.GoogleAuthException फेंकता: अज्ञात। कोई विचार क्यों? क्या मेरे क्षेत्रों में कुछ गड़बड़ है? https://gist.github.com/lawloretienne/7351151 – toobsco42

0

पर PlusClient.loadPerson() और ईमेल PlusClient.getAccountName() के लिए, अधिक विवरण देखने मैं इसी तरह की समस्या थी। एक्सेस टोकन समाप्ति के साथ समस्या को हल करने के लिए, मैं क्लाइंट-साइड पर टोकन को डीकोड करता हूं, और टोकन पेलोड में "एक्सप" फ़ील्ड को चेक करता हूं। इस तरह, मैं सर्वर पर भेजने से पहले टोकन समाप्ति को पहचान सकता हूं। अधिक जानकारी इस blog post

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