2015-11-03 7 views

Antwort

5

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!

+0

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

+0

@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! –

+0

Danke! Ich werde es versuchen :) – arts777