मैं 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
जो मतलब नहीं है है।
पर कोई विवरण है क्या आप प्लस क्लाइंट पर प्रदत्त विधियों का उपयोग करने के बजाय मैन्युअल रूप से ऐसा करने का प्रयास कर रहे हैं? ग्राहक को आपके ऐप की तरफ से टोकन एक्सचेंजों को स्वचालित रूप से संभालना चाहिए। – BrettJ
मैं पीछा [इस] (https://developers.google.com/+/mobile/android/people#retrieve_an_authenticated_users_email_address) पहुँच टोकन प्राप्त करने के। दूसरी तरफ जहां यह स्वचालित रूप से संभाला जाता है? –