Come get il token di accesso dopo che l'utente è connesso da Gmail in Android?

Sto seguendo Google Accedi per Android . Ora posso get l' idToken ma il mio server di back end che ho usato in precedenza prevede l' accesso al Token mentre stavo utilizzando l'accesso Google+ in precedenza. Ora non voglio modificare il mio lato server. Ma comunque posso utilizzare Google Accedi e get il Token di accesso nella mia applicazione Android in modo da poter validationre il mio utente sul mio server di back-end.

Stavo usando GooglePlay Service 7.5.0 in precedenza e adesso sto usando GooglePlay Service latest 8.3.0.

  • Eccezione Android: java.io.IOException: apri fallito: EACCES (authorization negata)
  • L'image colorata si è girata per non avere colore e solo un vector grigio in disegni?
  • Ingrandire e distriggersre la camera personalizzata - Eccezione puntatore nullo
  • Quale intento avrebbe aperto un pdf da un url?
  • Visualizzazione di foto in una listVisualizza come get l'adattatore da precaricare prima che gli utenti possano vedere l'elenco?
  • Sono tutte le autorizzazioni necessarie da PhoneGap su Android?
  • Android Studio Javadoc: imansible trovare il simbolo
  • Come posso impostare un interruttore Android?
  • Cambia utente-agente PhoneGap / Cordova per AJAX
  • Il browser Android è in grado di eseguire una trasformazione xsl?
  • Margini di un LinearLayout, programmaticamente con dp
  • Android: Come: contrassegnare la posizione corrente in una mappa (image fisso) - CODICE DI SORGENTE, TESTCASE, USO EFFETTIVO, ESEGUITO
  • 2 Solutions collect form web for “Come get il token di accesso dopo che l'utente è connesso da Gmail in Android?”

    Per i tuoi requisiti, puoi utilizzare il seguente codice:

    Innanzitutto, assicurati di avere un ID cliente Web OAuth 2.0 valido:

     <!-- Server Client ID. This should be a valid Web OAuth 2.0 Client ID obtained from https://console.developers.google.com/ --> <string name="server_client_id">...e4p8.apps.googleusercontent.com</string> 

    Allora all'interno della class Attività:

     @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ... // For sample only: make sure there is a valid server client ID. validateServerClientID(); // [START configure_signin] // Configure sign-in to request offline access to the user's ID, basic // profile, and Google Drive. The first time you request a code you will // be able to exchange it for an access token and refresh token, which // you should store. In subsequent calls, the code will only result in // an access token. By asking for profile access (through // DEFAULT_SIGN_IN) you will also get an ID Token as a result of the // code exchange. String serverClientId = getString(R.string.server_client_id); GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestScopes(new Scope(Scopes.DRIVE_APPFOLDER)) .requestServerAuthCode(serverClientId) .requestEmail() .build(); // [END configure_signin] // Build GoogleAPIClient with the Google Sign-In API and the above options. mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); } private void getAuthCode() { // Start the retrieval process for a server auth code. If requested, ask for a refresh // token. Otherwise, only get an access token if a refresh token has been previously // retrieved. Getting a new access token for an existing grant does not require // user consent. Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); startActivityForResult(signInIntent, RC_GET_AUTH_CODE); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_GET_AUTH_CODE) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); Log.d(TAG, "onActivityResult:GET_AUTH_CODE:success:" + result.getStatus().isSuccess()); if (result.isSuccess()) { // [START get_auth_code] GoogleSignInAccount acct = result.getSignInAccount(); String authCode = acct.getServerAuthCode(); // Show signed-in UI. mAuthCodeTextView.setText(getString(R.string.auth_code_fmt, authCode)); updateUI(true); // TODO(user): send code to server and exchange for access/refresh/ID tokens. // [END get_auth_code] } else { // Show signed-out UI. updateUI(false); } } } 

    È ansible vedere l'integer codice al seguente ServerAuthCodeActivity.java

    Il risultato, se si utilizza questo esempio, sembra la seguente image:

    Screenshot di BNK

    Quindi puoi seguire i passaggi menzionati nella documentazione di Google riportta di seguito (dal punto 3. Invia il codice di authorization al backend dell'applicazione utilizzando HTTPS POST ):

    Accesso da Google per Android – abilitazione dell'accesso sul lato server


    AGGIORNAMENTO: dai commenti, se si desidera get il token di accesso direttamente da app di android client, utilizzare il seguente codice di esempio (sostituito con il client_id, il client_secret e il codice di authorization)

     OkHttpClient client = new OkHttpClient(); RequestBody requestBody = new FormEncodingBuilder() .add("grant_type", "authorization_code") .add("client_id", "812741506391-h38jh0j4fv0ce1krdkiq0hfvt6n5amrf.apps.googleusercontent.com") .add("client_secret", "{clientSecret}") .add("redirect_uri","") .add("code", "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8") .build(); final Request request = new Request.Builder() .url("https://www.googleapis.com/oauth2/v4/token") .post(requestBody) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(final Request request, final IOException e) { Log.e(LOG_TAG, e.toString()); } @Override public void onResponse(Response response) throws IOException { try { JSONObject jsonObject = new JSONObject(response.body().string()); final String message = jsonObject.toString(5); Log.i(LOG_TAG, message); } catch (JSONException e) { e.printStackTrace(); } } }); 

    Si prega di utilizzare compile 'com.squareup.okhttp:okhttp:2.6.0' (ver 3-RC1 avrà diverse classi)

    Con una risposta affidabile, avrai le seguenti informazioni in logcat:

     I/onResponse: { "expires_in": 3600, "token_type": "Bearer", "refresh_token": "1\/xz1eb0XU3....nxoALEVQ", "id_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjQxMWY1Ym......yWVsUA", "access_token": "ya29.bQKKYah-........_tkt980_qAGIo9yeWEG4" } 

    BNK ha la sua posizione per la maggior parte. La class Attività è la stessa che BNK risponde solo con l'aggiunta della parte OkHttp una volta ottenuto il onActivityResult() metodo onActivityResult() .

    Ma stavo ancora ottenendo errori con la parte di richiesta OkHttp. Finalmente dopo un po 'di test (e parte di fortuna) intorno a Postman, ho scoperto che mancava il parametro id_token. La richiesta OkHttp mancava di un parametro, vale a dire l'id_token. Utilizza il token ID che ottieni da GoogleSignInAccount qualcosa di simile

     GoogleSignInAccount acct = result.getSignInAccount(); String idTokenString = acct.getIdToken(); 

    Ora usi questo idTokenString insieme a tutti i parametri nella parte OkHttp della risposta di BNK in qualche modo come questo

     ... RequestBody requestBody = new FormEncodingBuilder() .add("grant_type", "authorization_code") .add("client_id", "812741506391-h38jh0j4fv0ce1krdkiq0hfvt6n5amrf.apps.googleusercontent.com") .add("client_secret", "{clientSecret}") .add("redirect_uri","") .add("code", "4/4-GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8") .add("id_token", idTokenString) // Added this extra parameter here .build(); ... 

    La risposta che si ottiene è la stessa di BNKs risposta

     { "access_token": "ya29.CjBgA_I58IabCJ...remainingAccessTokenHere", "token_type": "Bearer", "expires_in": 3577, "id_token": "eyJhbGciOiJS...veryLongStringHere" } 

    Ora invialo a questo access_token al server backend per l'authentication proprio come hai fatto durante i tempi di GoogleAuthUtil e PlusAPI.

    Spero che questo aiuti 🙂 Ringraziamenti speciali a BNK!

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.