2013-07-24 7 views
7

Sto cercando di ottenere un codice di autenticazione di Google+ in base a questo articolo: Server-side access for your app. Tuttavia, ogni volta che corro la mia app e cercare di ottenere il codice ottengo il seguente in LogCat:Android Google+ non è in grado di ottenere il codice di autenticazione

07-23 23:42:31.760: E/getAccessToken()(11114): [ERROR] GoogleAuthException: com.google.android.gms.auth.GoogleAuthException: Unknown 

ho passato in rassegna un sacco di roba e da quello che posso dire Ho installato tutto correttamente nel seguente codice. Qualche idea sul perché non ottiene un token di autenticazione?

FYI, ho una configurazione di progetto nella console API che ha sia l'app che le applicazioni web configurate per oauth e sto usando l'ID del server (non l'app) per la stringa degli ambiti. Ho seguito anche gli esempi dal link precedente e l'app funziona correttamente e ti consente di accedere/uscire, ma non riesco a ottenere il codice di autenticazione.

private String getAccessToken() { 
    String scopesString = Scopes.PLUS_LOGIN + " " + Scopes.PLUS_PROFILE; 
    String scope = "oauth2:server:client_id:" + SERVER_CLIENT_ID + ":api_scope:" + scopesString; 
    Bundle appActivities = new Bundle(); 
    appActivities.putString(GoogleAuthUtil.KEY_REQUEST_VISIBLE_ACTIVITIES, 
      "http://schemas.google.com/AddActivity"); 
    String code = null; 
    try { 
     code = GoogleAuthUtil.getToken(
        this,        // Context context 
        mPlusClient.getAccountName(),  // String accountName 
        scopes,       // String scope 
        appActivities      // Bundle bundle 
       ); 
    } catch (IOException transientEx) { 
     // network or server error, the call is expected to succeed if you try again later. 
     // Don't attempt to call again immediately - the request is likely to 
     // fail, you'll hit quotas or back-off. 
     Log.e("getAccessToken()", "[ERROR] IOException: " + transientEx); 
     return null; 
    } catch (UserRecoverableAuthException e) { 
      // Recover 
     Log.e("getAccessToken()", "[ERROR] UserRecoverableAuthException: " + e); 
     code = null; 
    } catch (GoogleAuthException authEx) { 
     // Failure. The call is not expected to ever succeed so it should not be 
     // retried. 
     Log.e("getAccessToken()", "[ERROR] GoogleAuthException: " + authEx); 
     return null; 
    } catch (Exception e) { 
     Log.e("getAccessToken()", "[ERROR] Exception: " + e); 
     throw new RuntimeException(e); 
    } 
    return code; 
} 

risposta

1

Non lo so se hai modificato la riga per pubblicare la domanda ma guardando il codice che hai postato, questa riga è errata:

String scopes = "oauth2:server:client_id:<My server client ID>:scopesString"; 

Dovrebbe essere:

String scopes = "oauth2:server:client_id:" + SERVER_CLIENT_ID + ":api_scope:" + scopeString; 
+0

Scusa, mia cattiva. Sembra che ho rimosso quella parte quando l'ho pubblicata, ho ": api_scope:" nel mio codice. Ho aggiornato il post per dimostrarlo. – Jason

+0

Ahhh ... Mi è mancato separare scopeString alla fine. Ho apportato questa modifica e ora ricevo un errore "UserRecoverableAuthException: NeedPermission". Ho provato a gestirlo, ma ora sto fondamentalmente avendo [questo problema] (http://stackoverflow.com/questions/17713435/android-google-integration-repeated-userrecoverableauthexception). Lo contrassegnerò come corretto, dal momento che ha risolto il problema iniziale che stavo facendo ... stupido errore a tarda notte ;-) – Jason

+0

Da quando il metodo GoogleAuthUtil.getToken() ha iniziato a lanciare un'eccezione GoogleAuthException con messaggio "BadUsername" per un'email che non è registrato su un dispositivo, invece dell'eccezione precedente IllegalArgumentException con messaggio "Account non esistente 'indirizzo_email'"? http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html#getToken(android.content.Context, java.lang.String, java.lang.String) – toobsco42

3

provare questo,

in voi onCreate() scrivere,

new GetTokenAsync.execute(); 

e poi scrivere AsyncTask per ottenere token di accesso come,

public class GetTokenAsync extends AsyncTask<String, String, String> 
     { 

      @Override 
      protected void onPreExecute() 
       { 

        super.onPreExecute(); 
        plusUtilities.ShowProgressDialog("Getting Token..."); 

       } 

      @Override 
      protected String doInBackground(String... params) 
       { 
        String scope = "oauth2:" + Scopes.PLUS_LOGIN + " " + Scopes.PLUS_PROFILE; 
        try 
         { 
          // We can retrieve the token to check via 
          // tokeninfo or to pass to a service-side 
          // application. 
          String token = GoogleAuthUtil.getToken(getParent(), mPlusClient.getAccountName(), scope); 
          Log.i("OAUTH Token:", token); 
          Log.i("Scope:", "" + scope); 
          Log.i("GOOGLE_ACCOUNT_TYPE", "" + GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE); 

          Person currentperson = mPlusClient.getCurrentPerson(); 
           Log.i("person", currentperson.toString()); 

         } 
        catch (UserRecoverableAuthException e) 
         { 
          Log.e("UserRecoverableAuthException", "UserRecoverableAuthException"); 
          e.printStackTrace(); 
         } 
        catch (IOException e) 
         { 
          Log.e("IOException", "IOException"); 
          e.printStackTrace(); 
         } 
        catch (GoogleAuthException e) 
         { 
          Log.e("GoogleAuthException", "GoogleAuthException"); 
          e.printStackTrace(); 
         } 
        catch (Exception e) 
         { 
          Log.e("Exception", "Exception"); 
          e.printStackTrace(); 
         } 
        return null; 
       } 

      @Override 
      protected void onPostExecute(String result) 
       { 

        super.onPostExecute(result); 
        plusUtilities.DissmissProgressDialog(); 
       } 

     } 
+0

Grazie, ma ci sono alcune cose che non funzionano per me con questa risposta: 1. La chiamata a questo da onCreate() non funzionerà, in quanto l'utente deve essere autenticato per utilizzare mPlusClient. . 2. Nel link che ho sopra, questa è praticamente la soluzione che hanno elencato per il token "online". Sto cercando di ottenere un token "offline" che posso verificare sul mio server. Ho una variazione di ciò che hai elencato sopra, e funziona bene, ottengo un token, ma non è il tipo di token di cui ho bisogno (online anziché offline). – Jason

+0

puoi aiutarmi per favore su questo bug http://stackoverflow.com/questions/21445265/google-coordinate-authentification –

+0

upvoting per la LOC: Scope = "oauth2:" + Scopes.PLUS_LOGIN + "" + Ambiti. PLUS_PROFILE; – Mingsheng

Problemi correlati