Teil I: Mit dem Google Plus Services API
Wenn ich Ihre Frage richtig verstanden hat, können Sie in der Lage zu erreichen, was Sie versuchen, die Google Plus Services API zu tun verwenden.
Sie erstellen Ihre GoogleSignInOptions
und erstellen Sie dann Ihre GoogleApiClient
mit diesen Anmeldeoptionen. Von dort verwenden Sie die Auth.GoogleSignInApi.getSignInIntent
mit Ihrer GoogleApiClient
als Parameter.
Diese Absicht sollte eine SignInIntent
starten, die die Google-Kontoauswahl präsentiert (die Konten umfasst, auf die zuvor auf dem Gerät zugegriffen wurde, und die Möglichkeit, ein anderes Konto hinzuzufügen).
Sobald Sie die GoogleSignInResult
zurückbekommen, können Sie überprüfen, ob der Benutzer authentifiziert wurde, und dann den Authentifizierungsablauf wie sonst erstellen.
Sogar im Android SDK ist das Google SignInButton
enthalten, das Sie direkt in Ihrem Layout verwenden können, anstatt eine benutzerdefinierte Schaltfläche für die Anmeldung erstellen zu müssen.
Teil II: Mit WebViewClient
Nun, wenn Sie sie zu authentifizieren, um eine WebView
zu verwenden versuchen, die beste Wahl ist, um die WebViewClient
Klasse zu erweitern.
Dinge, die Sie benötigen:clientId
, clientSecret
und clientScope
(alle diese Details für Sie gegeben werden, wenn Sie Ihre Anwendung in der Google Developer Console erstellen)
Das Wichtigste zuerst zu ermächtigen, Ihre URL wird wahrscheinlich wie folgt sein: https://accounts.google.com/o/oauth2/auth?response_type=code&clientId={your client id}&state={SOMESTATEINFO}&access_type=offline
(Zugriffstyp, wenn Sie offline zugreifen möchten). Dies sollte die anfängliche URL Ihres WebView
Als nächstes werden Sie Ihre erweiterte WebViewClient-Klasse ändern möchten. Was Sie tun möchten, ist die shouldOverrideUrlLoading(WebView webView, String url)
Methode zu überschreiben, auf Ihre redirectURL
zu hören. Wahrscheinlich die einfachste Sache zu tun ist, url.startsWith(<your redirect URL>)
zu verwenden, um dies zu erkennen. Sie können dann die Antwort analysieren. Wenn Ihre Antwort error
enthält, bedeutet das, dass etwas schief gelaufen ist. Andernfalls sollten Sie zwei Felder in der URL zurückrufen: code
und state
. Wenn Sie error
nicht zurück erhalten, geben Sie true
für shouldOverrideUrlLoading
zurück.
Sobald Sie Ihre code
erhalten, können Sie eine neue GoogleAuthorizationCodeFlow
erstellen, mit Ihrem Client, Bereiche und Geheimnisse.
Sobald Sie Ihren Fluss haben, benötigen Sie eine GoogleTokenResponse
, die Sie mit der code
erhalten oben für Ihren Autorisierungscode, mit GoogleTokenResponse response = flow.newTokenResponse(<code>).setRedirectUri(<redirectUri>).execute()
erhalten können.
Sobald Sie dies getan haben, und Sie haben Ihre response
, können Sie Ihre Credential
mit flow.createAndStoreCredential(response, null)
erhalten.
Und voila, mit dieser Credential
, können Sie Ihre Anrufe authentifizieren.
Caveats Ich habe nicht in der Lage, die WebView
zu erkennen, Konten zu erhalten, die in auf anderen Web-Browsern unterzeichnet wurde, so dass die Kontoauswahl zeigt nur die Konten, die in auf den App-spezifischen WebView unterzeichnet wurden.
tl; dr Es ist möglich, dies ein WebView
und WebViewClient
mit dem zu tun, aber es ist chaotisch und ein wenig umständlicher als die Google Plus Services API verwenden.
This example besser veranschaulicht die Autorisierung Flow/Credential Zeug, wenn Sie den Autorisierungscode und so erhalten.
das kann auch nützlich sein.
Hoffe, dass dies hilft Ihnen in die richtige Richtung!
Danke für die Antwort. Ich meine die Benutzerautorisierung auf den Websites von Google, nicht in meiner App. Ich möchte beispielsweise, dass sich der Benutzer in Google Play (Web) in WebView anmeldet, aber ich möchte die Autorisierung nach GoogleApiClient verwenden (wenn der Benutzer einfach das vorhandene Konto über den Dialog auswählt), nicht die manuelle Eingabe von E-Mail/Passwort. Ich habe einige Beispiele gefunden (zum Beispiel im Quelltext von Android Browser), aber sie funktionieren nicht. – arts777
@RankoR Ich habe die Antwort mit einigen Details darüber aktualisiert, wie man es mit einem WebView macht (ich habe einige Erfahrung damit, weil es so ist, damit es in Xamarin richtig funktioniert). Die WebView-Route ist etwas umständlicher, ist aber möglich. Hoffentlich hilft das! –
Danke! Ich werde es versuchen :) – arts777