Ich habe Probleme, einen einmaligen Autorisierungscode von Google zu erhalten. Ich versuche, den Autorisierungscode von einem Android-Client abzurufen, damit ich ihn an mein Rails-Backend (Web-Client) senden kann.
In meiner Google Cloud Developer Console habe ich eine Anwendung mit zwei Client-IDs:
Client-ID für die Webanwendung (für mein Rails-Backend)
Client-ID für Android-Anwendung (für meinen Android-Client). Das verwendete SHA1 stammt von ~ / .android/debug.keystore
Angenommen, die Client-ID der Webanwendung lautet 12345.apps.googleusercontent.com
Angenommen, die Android-Client-ID lautet 67890.apps.googleusercontent.com
Dies ist ein Teil meines Codes:
%Vor%Einige zusätzliche Hinweise
Ich treffe die GoogleAuthException und erhalte "Unbekannt" als das Nachrichtendetail
Ich kann für dieses Projekt keine zusätzlichen Mitglieder in den Berechtigungen der Google Cloud Console hinzufügen. Beim Hinzufügen eines neuen Mitglieds erscheint ein Popup mit "Server Error. Whoops! Our bad.". Ich habe zweimal Feedback an Google gesendet.
Ich beziehe mich auf diese Dokumentation . Beachten Sie das unten stehende Zitat. Mit "fixed" heißt es, dass ich in meiner GOOGLE_CALENDAR_API_SCOPE -Variable nicht audience: server: client_id vorstellen muss? Ich habe sowohl mit als auch ohne versucht und immer noch die gleiche GoogleAuthException bekommen.
In dieser Situation kann die Android App den GoogleAuthUtil.getToken () -Methode im Namen von Google Konten auf dem Gerät und mit einem Bereichsargumentwert von Zielgruppe: Server: client_id: 9414861317621.apps.googleusercontent.com. Das Präfix audience: server: client_id: ist fest und der Rest der Bereichszeichenfolge ist die Client-ID der Webkomponente.
Wenn ich diesen Bereich verwende, kann ich mich mit google vom Gerät authentifizieren. Die Dokumentation, die ich gelesen habe, schlägt jedoch vor, dass ich die Server-Webclient-ID (die sich im selben Google-Konsolenprojekt wie die Android-Client-ID befindet) im Bereich verwenden muss, damit der Server die Google API im Namen von Google trifft Der Benutzer, der es auf dem Android-Client autorisiert hat:
private final static String GOOGLE_CALENDAR_API_SCOPE = "oauth2:https://www.googleapis.com/auth/calendar";
UPDATE 1
Ich habe ursprünglich in Antwort hinzugefügt: Der Grund für mein erstes Problem - ich treffe die GoogleAuthException und empfange "Unknown" als Nachrichtendetail - war ein Fehler, den ich gemacht habe, als ich die Android-Client-ID in der Cloud-Konsole hinzugefügt habe. Die SHA1 war korrekt, aber ich habe den Paketnamen nicht korrekt eingegeben. Ich habe com.company.app verwendet, wenn mein Android-Paket tatsächlich com.company.android.app ist. Der Code in der ursprünglichen Frage funktioniert einwandfrei. Stellen Sie nur sicher, dass Sie alle erforderlichen Clients in Ihrem Google Cloud Console-Projekt haben.
Aber ein anderes Problem existiert noch. Wenn ich das einmalige Autorisierungstoken, das von GoogleAuthUtil.getToken () zurückgegeben wurde, an das Rails-Backend sendet und dann versuche, es gegen ein access_token und refresh_token auszutauschen, bekomme ich Folgendes:
%Vor% Diese Google-Dokumentation und mehrere SO-Posts weisen darauf hin, dass ich access_type=offline
festlegen muss. Aber ich denke, das ist, wenn Sie den einmaligen Autorisierungscode und Offline-Zugriff von einem Web-Server anfordern. Ich versuche, den einmaligen Autorisierungscode von einem Android-Client anzufordern und an den Webserver zu senden.
Ist dies mit GoogleAuthUtil.getToken () möglich?
UPDATE 2
Die Google Plus-Anmeldung muss im Gültigkeitsbereich enthalten sein, auch wenn Sie nur versuchen, auf den Kalender zuzugreifen:
%Vor%Dies SO-Post war hilfreich. In der Google Cross Client-Identitätsdokumentation heißt es außerdem:
[Hinweis: Diese Richtlinie wird schrittweise eingeführt. Im Moment, wenn Zugriffstokens betroffen sind, gilt dies nur, wenn die angeforderten Bereiche Ссылка
Ich werde in einer Antwort zusammenfassen, ob der Tokenaustausch im Rails-Backend funktioniert.
Zwei Dinge haben das für mich gelöst:
Stellen Sie sicher, dass die IDs von Android und Web-Client im selben Google Cloud Console-Projekt korrekt eingerichtet sind.
Verwenden Sie den richtigen Bereich. Plus-Login ist erforderlich, auch wenn Sie nur auf die Kalender-API zugreifen:
// die ID des Webservers, der den Authentifizierungscode für Zugriffs- und Aktualisierungstoken austauscht
private endgültige statische Zeichenfolge WEB_CLIENT_ID="12345.apps.googleusercontent.com"; private final static Zeichenfolge GOOGLE_CALENDAR_API_SCOPE="oauth2: server: client_id:" + WEB_CLIENT_ID + ": api_scope: Ссылка Ссылка ";
Folgendes habe ich getan:
%Vor%Aber du solltest einfach getToken für eine Vordergrundaktivität gleich funktionieren.
Nehmen Sie dieses Token und senden Sie es so an den Server, dass Sie es wie einen HTTP-Header (über HTTPS) verwenden können. Solange der Serverbereich eine Teilmenge des zum Erfassen des Tokens verwendeten Bereichs ist, sollten Sie kein Problem haben. Der Server verwendet die Server-ID und der Android-Client verwendet die Android-Client-ID.
Sie sollten Ihren Bereich auf entweder:
setzen %Vor%oder
%Vor%Weitere Informationen finden Sie unter Ссылка
Bearbeiten: OK Ich sehe, was Sie versuchen zu tun. Der Wert für den Gültigkeitsbereich ist eine durch Leerzeichen getrennte Liste, sodass Sie wahrscheinlich die Zielgruppe anhängen müssen: server: client_id: an Ihren Bereich wie:
%Vor%Tags und Links android ruby-on-rails google-authentication google-cloud-platform