5

Ho un'app che utilizza Google Cloud Endpoint. Alcuni metodi necessitano di autorizzazione, quindi ho seguito il tutorial this. Ciò richiede le autorizzazioni GET_ACCOUNTS.Utilizza gli endpoint Google Cloud autorizzati con Google Accedi

Sto aggiornando l'app per funzionare con i permessi di runtime. Non mi piace chiedere l'autorizzazione per leggere i contatti, ma GET_ACCOUNTS è nello stesso gruppo. Per questo motivo, sto cercando di utilizzare l'autorizzazione senza autorizzazione GET_ACCOUNTS.

Penso che il Google Sign In potrebbe funzionare ma non riesco a trovare un modo per utilizzare il risultato di Google Accedi.

Questo è il codice utilizzato per creare l'oggetto per effettuare le chiamate al punto finale:

Helloworld.Builder helloWorld = new Helloworld.Builder(AppConstants.HTTP_TRANSPORT, AppConstants.JSON_FACTORY,credential); 

L'oggetto credenziale deve essere un HttpRequestInitializer ma dal segno di Google In I ottenere un GoogleSignInAccount.

Quindi, è possibile farlo? Come dovrebbe essere fatto?

risposta

6

Ho finalmente trovato la soluzione. Utilizzando il tutorial trovato here.

È necessario aggiungere l'ID client nelle GoogleSignInOptions:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) 
      .requestIdToken(CLIENT_ID) 
      .requestEmail() 
      .build(); 

Seguendo il tutorial avrete finalmente ottenere un GoogleSignInAccount. Impostare il token dal GoogleSignInAccount in un oggetto GoogleCredential:

GoogleCredential credential = new GoogleCredential.Builder().setTransport(new NetHttpTransport()) 
      .setJsonFactory(JacksonFactory.getDefaultInstance()) 
      .build(); 
credential.setAccessToken(GoogleSignInAccount.getIdToken()); 

Questa credenziale è pronto per effettuare chiamate autenticate a Google Cloud Enpoints.

Nota che è necessario rimuovere "server: client_id:" parte da CLIENT_ID. Quindi, se si sta utilizzando questo:

credential = GoogleAccountCredential.usingAudience(this, 
    "server:client_id:1-web-app.apps.googleusercontent.com"); 

tuo CLIENT_ID sarebbe:

CLIENT_ID = "1-web-app.apps.googleusercontent.com" 

Si noti inoltre che il token è valida per un periodo di tempo limitato (. Aprox 1 ora di mio test)

+0

fantastico, stavo proprio guardando questo per la stessa ragione che hai (rifare le autorizzazioni per supportare il modello runtime e volevo semplificare), grazie mille! Mi chiedo se questo risolva anche il problema sul lato cloud endpoint google in cui è necessario ricaricare l'utente autorizzato in quanto non ha l'id ... – Creos

+0

non funziona per me: il backend riceve un NULL com.google.appengine .api.users.User che si verifica quando l'autorizzazione non è riuscita. hai affrontato lo stesso problema? grazie – Creos

+0

Ho modificato la risposta. Verifica se hai impostato correttamente CLIENT_ID. Devi rimuovere "server: client_id:". Ho anche scoperto che il token è scaduto, quindi funzionerà solo in un periodo di tempo limitato dopo l'accesso. – 9and3r