2012-05-11 2 views
7

Ich schreibe eine Android-App, die mit einem Remote-Server kommuniziert, und ich möchte App-Nutzern erlauben, sich mit den Google-Anmeldeinformationen auf ihrem Server anzumelden Der Nutzer kann sein Google-Passwort überall in meiner App eingeben. Wenn beispielsweise das Telefon (Android) des Benutzers mit "[email protected]" konfiguriert wurde und sie dann meine App installieren und ausführen, wird sie in meiner App mit dem folgenden Dialogfeld angezeigt: "Möchten Sie sich als someguy @ anmelden? gmail.com? ", und wenn sie auf OK klicken, haben sie eine ID auf meinem Server eingerichtet, die weiß, dass ihre E-Mail-Adresse [email protected] ist, wie von Google selbst bestätigt.Google-Kontoautorisierung innerhalb einer Android-App

Ich habe weit verbreitete und vielfältige Teilrezepte gefunden, wie man das angehen kann, einschließlich googles eigener oauth2-Dokumentation, aber habe kein Verständnis dafür entwickelt, wie alles möglich ist.

Ich habe Android-Code, der den AccountManager verwendet, um herauszufinden, welche Google-Konten auf einem bestimmten Telefon sind. Ich frage den Benutzer nach dem Google-Konto, mit dem er sich anmelden möchte, und erhalte dann ein Autorisierungs-Token zurück.

Über diesen Punkt hinaus spinn ich meine Räder. Die Rezepte, die ich geschaut haben zu scheinen für mein Tun eine http-get dieser Form zu nennen:

http://<myWebServer>.com/_ah/login?continue=<someUrlIChoose>&auth=<authToken> 

..., die (a) in ist unbefriedigend, dass es appengine um genau zu sein scheint, und ich möchte die Freiheit um dies auf jedem beliebigen Backend meiner Wahl auszuführen und (b) sogar mit appengine zu experimentieren, scheint die appengin-Instanz, die ich eingerichtet habe, überhaupt nicht signalisiert zu werden, dh die Logs zeigen nun Anfragen dazu (ich hatte gehofft die someURlIChoose-URL wäre mit etwas aufgerufen worden) ... daher keine Möglichkeit, über die Gültigkeit des Tokens informiert zu werden.

Spezifische Fragen wären:

  • Was mache ich mit den Auth-Token ... mache ich es auf meinen Server zu senden, und irgendwie meinen Server Kontakt Google hat die Token Gültigkeit für das überprüfen angegebenes Konto? Oder gibt es einige Backchannel Kommunikation, die bereits (in diesem Stadium der Prozess) von den Google-Servern stammen soll, um meinen Server zu informieren, dass dieser Token gültig ist (und wenn ja, wie stelle ich das auf)? Oder etwas sonst?
  • Bin ich richtig zu der Annahme, dass dieser Prozess in der Kontext eines Back-End (nicht nur appengine) machbar sein könnte?
  • Ist oauth2 was ich verwenden soll (im Gegensatz zu oauth1 oder etwas sonst)? Alles, was ich lese, scheint zu implizieren, dass Googles Unterstützung für oauth2 "experimentell" ist ... aber ich habe nicht festgestellt, ob solche Behauptungen aktuell oder alt sind; und selbst wenn aktuell, hat Google eine Geschichte der Aufbewahrung verschiedener Produkte in permanenter nicht-endgültige Form (z. B. ewige Beta), so dass ich nicht weiß, was Sie dazu schließen.
  • Alles andere, die ...

Antwort

0

relevant ist, ist es das, was Sie sind loooking?

Die meisten Android-Apps haben eine Art serverseitiges Backend, um Daten zu speichern und zu teilen. Selbst das grundlegendste Spiel muss sich an seine Highscores erinnern.Wenn Sie Ihr Back-End erstellen, ein Problem Sie haben, ist zu lösen, wie der Back-End-Code weiß, welche App es spricht zu und wer die Person, die es ist.

Sie haben wahrscheinlich HTTP-Endpunkte für die Kommunikation mit Ihrem Client Apps, aber wie kann der serverseitige Code sicher sein, wer Nachrichten zu ihm sendet? Schließlich kann jeder von überall HTTP-POST-Anfragen senden; könnten sie Ihre Benutzer imitieren, wenn sie ihre Identitäten erraten könnten?

Es ist wirklich benutzerunfreundlich, Leute zu bitten, Benutzernamen und Kennwörter auf mobilen Geräten einzugeben. Insbesondere, wenn jemand Ihre App installiert und ihm die Erlaubnis gegeben hat, das Internet zu nutzen und Ihre Identität zu kennen, sollten diese nicht mehr belästigt werden.

Es stellt sich heraus, dass Google Play-Dienste, jetzt verfügbar auf jedem kompatiblen Gerät mit Android-Release 2.2 oder höher, bietet eine gute Lösung für dieses Problem, basierend auf der Verwendung von Google-Konten.

http://android-developers.blogspot.se/2013/01/verifying-back-end-calls-from-android.html

2

Sie müssen Google-Play-services_lib importieren, nachdem als Sie diesen Code verwenden können:

import com.google.android.gms.auth.GoogleAuthUtil; 
import com.google.android.gms.auth.UserRecoverableAuthException; 

private void gmail_login() { 

    dialog = ProgressDialog.show(LoginActivity.this, "", getString(R.string.login_loading), true); 

    AsyncTask task = new AsyncTask() { 
     @Override 
     protected Object doInBackground(Object... params) { 
       getAndUseAuthTokenBlocking(); 
      return null; 
     } 
    }; 
    task.execute((Void)null); 
} 


void getAndUseAuthTokenBlocking() { 
    try 
    { 
     String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/plus.me https://www.googleapis.com/auth/userinfo.email"; 
     AccountManager accountManager = AccountManager.get(this); 
     Account[] accounts = accountManager.getAccountsByType("com.google"); 

     String token = GoogleAuthUtil.getToken(this, accounts[0].name, AUTH_TOKEN_TYPE); 
     //token here 
    } 
    catch (UserRecoverableAuthException userAuthEx) { 
     startActivityForResult(userAuthEx.getIntent(), MY_ACTIVITYS_AUTH_REQUEST_CODE); 
    }catch (Exception e){ 
     DropErrorMsg.drop(this, handler, R.string.connection_error, R.string.error, dialog, false); 
    } 
} 
Verwandte Themen