5

Ich habe eine App, die Google Cloud Endpoints verwendet. Einige Methoden benötigen eine Autorisierung, also folgte ich this Tutorial. Dies erfordert die Berechtigungen GET_ACCOUNTS.Autorisierte Google Cloud Endpoints mit Google verwenden Anmelden

Ich aktualisiere die App, um mit Laufzeitberechtigungen zu arbeiten. Ich möchte keine Erlaubnis zum Lesen von Kontakten anfordern, aber GET_ACCOUNTS befindet sich in derselben Gruppe. Aus diesem Grund suche ich eine Berechtigung ohne die Berechtigung GET_ACCOUNTS.

Ich denke, dass Google Sign In könnte funktionieren, aber ich bin nicht in der Lage, eine Möglichkeit zu finden, das Ergebnis von Google Anmelden zu verwenden.

Dies ist der Code verwendet, um das Objekt zu erstellen, um die Anrufe an den Endpunkt zu machen:

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

das Credential-Objekt muss ein HttpRequestInitializer sein, aber aus dem Google Einloggen ich ein GoogleSignInAccount bekommen.

Also, ist es möglich, dies zu tun? Wie soll das gemacht werden?

Antwort

6

Ich habe endlich die Lösung gefunden. Verwenden Sie das Tutorial gefunden here.

Sie müssen die Client-ID in den GoogleSignInOptions hinzufügen:

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

Tutorial Nach Sie endlich eine GoogleSignInAccount bekommen. Stellen Sie die Token von dem GoogleSignInAccount in einem GoogleCredential Objekt:

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

Dieser Berechtigungsnachweis bereit ist authentifizierte Anrufe zu Google Cloud Enpoints zu machen.

Beachten Sie, dass Sie den Teil "server: client_id:" aus der CLIENT_ID entfernen müssen. Also, wenn Sie diese wurden mit:

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

Ihre CLIENT_ID wäre:

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

Beachten Sie auch, dass das Token für eine begrenzte Zeit gültig ist (. Ca. 1 Stunde in meinem Test)

+0

fantastisch, ich habe genau aus dem gleichen Grund wie Sie gesucht (Erneute Berechtigungen für das Laufzeit-Modell zu unterstützen und zu straffen), vielen Dank! Ich frage mich, ob dies auch das Problem auf der Cloud-Endpunkte Cloud-Seite löst, wo Sie den autorisierten Benutzer neu laden müssen, da es nicht die ID hat ... – Creos

+0

funktioniert nicht für mich: das Back-End empfängt eine NULL com.google.appengine .api.users.User, was passiert, wenn die Autorisierung fehlgeschlagen ist. Hattest du das gleiche Problem? thx – Creos

+0

Ich habe die Antwort bearbeitet. Überprüfen Sie, ob die CLIENT_ID korrekt eingestellt ist. Sie müssen "server: client_id:" entfernen. Ich habe auch festgestellt, dass das Token abläuft, so dass dies nur in einer begrenzten Zeit nach der Anmeldung funktionieren wird. – 9and3r

Verwandte Themen