sto usando il codice followin per ottenere un token di accesso, dopo il collegamento a Google+, per ottenere il profilo informazioni e e-mail:Google Plus per Android: credenziali non valide
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");
Questo token di accesso non sto immagazzinando e cercando di riutilizzare. Invece chiedo sempre un token di accesso, aspettandomi un nuovo (diverso) token, in modo da non dover controllare se è scaduto ecc.
Ma sto ricevendo lo stesso token di accesso ogni volta che chiedo. Ho disinstallato l'app, cancellato i dati di App Google+ e ancora ottengo lo stesso token di accesso.
il problema reale è, usando questo token di accesso dà l'errore 401 - "message": "Invalid Credentials"
{
"error": {
"errors": [
{
"domain": "global",
"reason": "authError",
"message": "Invalid Credentials",
"locationType": "header",
"location": "Authorization"
}
],
"code": 401,
"message": "Invalid Credentials"
}
}
Questa è una risposta sul browser.
Su un dispositivo ottengo questo in 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)
Linea 269:
urlConnection = (HttpURLConnection) url.openConnection();
codice completo:
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();
EDIT:
Questo è sicuramente perché il token di accesso è scaduto. Il che era previsto, ma ho pensato di ottenere un nuovo token di accesso ogni volta che chiamo.
Ma, come detto here:
Se il dispositivo Android ha già un token di autenticazione (per il particolare servizio GData si sta cercando di accesso), sarà restituito a voi
Quindi, devo fare questo:
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;
}
come il docs dicono
Ma come posso verificare se il token di accesso è scaduto o non valido?
Rilevando l'eccezione: è l'unica soluzione?
In realtà l'eccezione è java.io.FileNotFoundException
che non ha senso.
C'è un motivo per cui si sta tentando di farlo manualmente piuttosto che utilizzare i metodi forniti su PlusClient? Il cliente deve gestire automaticamente gli scambi di token per conto della tua app. – BrettJ
Ho seguito [questo] (https://developers.google.com/+/mobile/android/people#retrieve_an_authenticated_users_email_address) per ottenere il token di accesso. Qual è l'altro modo in cui viene gestito automaticamente? –