8

La mia app Android utilizza attualmente GoogleAuthUtil per accedere agli utenti e scaricare uno access_token che viene passato al back-end (frammenti di codice al di sotto dei quali viene visualizzato GoogleApiClient e GoogleAuthUtil per ottenere il token).Accesso Google ottiene token di accesso con nuove GoogleSignInOptions

mGoogleApiClient = new GoogleApiClient.Builder(this) 
     .addConnectionCallbacks(this) 
     .addOnConnectionFailedListener(this) 
     .addApi(Plus.API) 
     .addScope(new Scope("profile")) 
     .build(); 
... 
... 

String accessToken = GoogleAuthUtil.getToken(GoogleLoginActivity.this, 
          Plus.AccountApi.getAccountName(mGoogleApiClient), 
          "oauth2:profile email"); 

che ho poi inviato al backend

Ora sto provando a passare al nuovo Google SignIn - https://developers.google.com/identity/sign-in/android/sign-in

e così cambiato la creazione GoogleApiClient come,

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
     .requestEmail() 
     .requestIdToken("<web client id>") 
     .build(); 
mGoogleApiClient = new GoogleApiClient.Builder(this) 
     .enableAutoManage(this, this) 
     .addApi(Auth.GOOGLE_SIGN_IN_API, gso) 
     .build(); 

e quindi per utilizzare il login,

startActivityForResult(Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient), RC_GET_TOKEN); 

e sull'uso risultato di attività (simile all'esempio nel link qui sotto),

OptionalPendingResult<GoogleSignInResult> opr = Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient); 
if (opr.isDone()) { 
    // If the user's cached credentials are valid, the OptionalPendingResult will be "done" 
    // and the GoogleSignInResult will be available instantly. 
    Log.d(TAG, "Got cached sign-in"); 
    handleSignInResult(opr.get()); 
} else { 
    // If the user has not previously signed in on this device or the sign-in has expired, 
    // this asynchronous branch will attempt to sign in the user silently. Cross-device 
    // single sign-on will occur in this branch. 
    showProgress(); 
    opr.setResultCallback(new ResultCallback<GoogleSignInResult>() { 
     @Override 
     public void onResult(GoogleSignInResult googleSignInResult) { 
      hideProgress(); 
      handleSignInResult(googleSignInResult); 
     } 
    }); 
} 

ma ora sembra che in handleSingInResult(GoogleSignInResult result) posso solo ottenere un id token indietro con result.getSignInAccount().getIdToken();

C'è qualcuno sapere se è possibile ottenere un token di accesso da questo (come in precedenza) e se sì, come? Qualsiasi aiuto apprezzato.

+0

Sto riscontrando lo stesso problema qui, sei riuscito a risolvere questo problema? –

+0

Non proprio. Ho dovuto implementare la gestione dei token ID nel back-end prima che potessi iniziare a usarlo. – Bootstrapper

+0

Ho finito per utilizzare il selettore di account di Android per ottenere il nome dell'account e GoogleAuthUtil.getToken (Context, accoutName, scope) per recuperare il token stesso, ha funzionato come un fascino e molto più semplice della prima approuch. –

risposta

4

Dopo la firma in voi sarete in grado di ottenere il token:

final String token = GoogleAuthUtil.getToken(mAppContext, mAccountName, AUTH_TOKEN_TYPE); 

Non dimenticate di farlo un AsyncTask. per maggiori dettagli date un'occhiata al here

EDIT:

Si noti che, nonostante il nome del metodo:

GoogleAuthUtil.getToken() 

che non ti dà un token OAuth, piuttosto restituisce un "corto - codice di autorizzazione avanzato "in base allo documentation.

Cosa devo fare dopo aver ottenuto il codice di autorizzazione chiamando lo GoogleAuthUtil.getToken()?

È necessario trasmettere il codice di autorizzazione al server di back-end tramite HTTPS. Solo dal tuo server dovresti tentare di ricevere il token di accesso e/o di aggiornamento, non nella tua app.

+0

questo non funziona di più. – Vyacheslav

+0

funziona ancora qui – abedfar

+5

@aberdfar, questo metodo è deprecato – Vyacheslav

2

Quindi stavo avendo lo stesso problema. hanno cambiato subito così il token viene attraverso in

GoogleSignInAccount acct = result.getSignInAccount(); 
Log.d(TAG, "handleSignInResult2: "+acct.getIdToken()); 

Per ottenere l'accesso anche questo token avete troppo chiedere che in

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestEmail().requestProfile().requestId().requestIdToken(getString(R.string.server_client_ID)) 
        .build(); 

Il R.string.server_client_ID è il client ID dal progetto che si fanno in la tua Console per gli sviluppatori di Google.

Spero che questo ti aiuti.

ecco anche la documentazione che ho seguito. https://developers.google.com/identity/sign-in/android/backend-auth

+3

come ho detto nella mia domanda, il token ricevuto in questo modo è un 'id_token' e non un' access_token'. Quindi per ora sembra che abbiamo ancora bisogno di recuperare 'access_token' allo stesso modo di prima con' GoogleAuthUtil.getToken() 'in un AsyncTask (speravo che ci fosse un altro modo ma comunque ...) – Bootstrapper

+0

È corretto. id_token deve essere scambiato per access_token. –