2013-07-24 10 views
7

Próbuję uzyskać kod autoryzacji Google+ na podstawie tego artykułu: Server-side access for your app. Jednak, gdy uruchamiam moją aplikację i spróbować uzyskać kod pojawia się następujący w LogCat:Android Google+ nie może uzyskać kodu autoryzacji

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

przeglądałem wiele rzeczy iz tego co mogę powiedzieć, mam setup wszystko poprawnie w poniższym kodzie. Jakieś pomysły, dlaczego nie otrzymuje tokena uwierzytelnienia?

FYI, mam jedną konfigurację projektu w konsoli API, która ma zarówno aplikację, jak i aplikacje internetowe skonfigurowane dla oautha i używam identyfikatora serwera (nie aplikacji) dla łańcucha zakresów. Podążałem również za przykładem (-ami) z powyższego linku, a aplikacja działa dobrze i pozwala na zalogowanie się/wylogowanie, ale po prostu nie mogę uzyskać kodu auth.

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

Odpowiedz

1

nie wiem jeśli zmodyfikowałeś wiersz, aby opublikować pytanie, ale patrząc na kod, który wysłałeś, ta linia jest błędna:

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

Powinno być:

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

Przepraszam, moje złe. Wygląda na to, że usunąłem tę część, kiedy ją opublikowałem, mam ": api_scope:" w moim kodzie. Zaktualizowałem wpis, aby to pokazać. – Jason

+0

Ahhh ... Tęskniłem za oddzielaniem zakresuString na końcu. Wprowadziłem tę zmianę i teraz pojawia się błąd "UserRecoverableAuthException: NeedPermission". Próbowałem to obsługiwać, ale teraz mam po prostu [ten problem] (http://stackoverflow.com/questions/17713435/android-google-integration-repeated-userrecoverable wyjątek). Zaznaczę to jako poprawne, ponieważ rozwiązało początkowy problem, który miałem ... głupią nocną pomyłkę ;-) – Jason

+0

Od tego czasu metoda GoogleAuthUtil.getToken() zaczęła wyrzucać wyjątek GoogleAuthException z komunikatem "BadUsername" dla wiadomości e-mail który nie jest zarejestrowany na urządzeniu, zamiast poprzedniego wyjątku IllegalArgumentException z komunikatem "Nieistniejące 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

spróbować,

w was onCreate() pisać,

new GetTokenAsync.execute(); 

a następnie napisać AsyncTask aby uzyskać dostęp jako tokena,

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

Dzięki, ale jest kilka rzeczy, które nie działają na mnie z tej odpowiedzi: 1. Wywołanie tej z onCreate() nie będzie działać, ponieważ użytkownik musi być uwierzytelniony, aby móc używać mPlusClient. . 2. W linku, który mam powyżej, jest to prawie rozwiązanie, które wymienili dla tokena "online". Próbuję uzyskać token "offline", który mogę zweryfikować na moim serwerze. Mam odmiany tego, co wymieniłeś powyżej i działa dobrze, dostaję token, ale nie jest to token, którego potrzebuję (online, a nie offline). – Jason

+0

Czy możesz mi pomóc w tym błędzie http://stackoverflow.com/questions/21445265/google-coordinate-authentification –

+0

upvoting dla LOC: String scope = "oauth2:" + Scopes.PLUS_LOGIN + "" + Zakresy. PLUS_PROFILE; – Mingsheng