2013-07-24 5 views
7

Ich versuche, einen Google+ Authentifizierungscode basierend auf diesem Artikel zu erhalten: Server-side access for your app. Jedes Mal, wenn ich meine app laufen und versuchen, den Code zu bekommen ich folgendes in LogCat erhalten:Android Google+ kann keinen Autorisierungscode erhalten

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

geblättert ich eine Menge Sachen und von dem, was ich sagen kann, ich habe alles richtig eingerichtet in dem folgenden Code haben. Irgendwelche Ideen, warum es kein Authentifizierungs-Token bekommt?

FYI, Ich habe ein Projekt-Setup in der API-Konsole, die App und Web-Anwendungen für oauth konfiguriert ist, und ich benutze die Server-ID (nicht die App) für die Bereiche Zeichenfolge. Ich habe auch die Beispiele aus dem obigen Link gefolgt und die App funktioniert gut und erlaubt Ihnen, sich anzumelden, aber ich kann den Auth-Code nicht bekommen.

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; 
} 

Antwort

1

Ich weiß nicht, Wenn Sie die Zeile geändert haben, um die Frage zu posten, aber den von Ihnen geposteten Code betrachten, ist diese Zeile falsch:

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

Es sollte sein:

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

Entschuldigung, mein Schlechter. Sieht so aus, als hätte ich diesen Teil entfernt, als ich ihn gepostet habe. Ich habe ": api_scope:" in meinem Code. Ich habe den Beitrag aktualisiert, um das zu zeigen. – Jason

+0

Ahhh ... Ich habe es vermisst, den scopeString am Ende zu trennen. Ich habe diese Änderung vorgenommen und erhalte jetzt einen Fehler "UserRecoverableAuthException: NeedPermission". Ich habe versucht, das zu handhaben, aber jetzt habe ich im Grunde [dieses Problem] (http://stackoverflow.com/questions/17713435/android-google-integration-repeated-uservrecurableauthexception). Ich werde dies als richtig markieren, da es das anfängliche Problem gelöst hat, das ich hatte ... blöder Spätnachtfehler ;-) – Jason

+0

Seit wann hat die GoogleAuthUtil.getToken() Methode begonnen, eine GoogleAuthException mit Nachricht "BadUsername" für eine E-Mail zu werfen das ist nicht auf einem Gerät registriert, anstelle der vorherigen Ausnahme IllegalArgumentException mit der Nachricht "Nicht existierendes Konto 'email_address'"? http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html#getToken(android.content.Context, java.lang.String, java.lang.String) – toobsco42

3

dies versuchen,

in Ihnen onCreate() schreiben,

new GetTokenAsync.execute(); 

und dann AsyncTask schreiben als Zugriffstoken zu erhalten,

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

Danke, aber es gibt ein paar Dinge, die für mich nicht mit dieser Antwort umgehen: 1. Aufruf dieser von onCreate() wird nicht funktionieren, da der Benutzer muss authentifiziert werden, um mPlusClient zu verwenden. . 2. In dem Link, den ich oben habe, ist dies so ziemlich die Lösung, die sie für das Token "online" aufgelistet haben. Ich versuche, ein "Offline" -Token zu erhalten, das ich auf meinem Server überprüfen kann. Ich habe eine Variation von dem, was Sie oben aufgelistet haben, und es funktioniert gut, ich bekomme ein Token, aber es ist nicht die Art von Token, die ich brauche (online im Gegensatz zu offline). – Jason

+0

können Sie mir bitte bei diesem Fehler helfen http://stackoverflow.com/questions/21445265/google-coordinate-authentification –

+0

upvoting für die LOC: String scope = "oauth2:" + Scopes.PLUS_LOGIN + "" + Scopes. PLUS_PROFILE; – Mingsheng

Verwandte Themen