1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

Android -> AppEngine Cookies

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von MrJack, 26.01.2012.

  1. MrJack, 26.01.2012 #1
    MrJack

    MrJack Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    67
    Erhaltene Danke:
    10
    Registriert seit:
    14.12.2011
    Phone:
    OnePlus One
    Hallo!

    Schreibe grade eine Android-App, die per Restlet mit der AppEngine kommuniziert.

    Meine App sieht folgendermaßen aus:
    1) Beim allerersten Start wird der Benutzer gefragt, mit welchem Google Account er sich authentifizieren will:
    Code:
    AccountManager manager = AccountManager.get( this );
    Account[] accounts = manager.getAccountsByType( "com.google" );
    
    2) Der ausgewählte Account wird in die SharedPreferences geschrieben UND in die AppEngine (habe dafür eine User-Tabelle)

    3) Für die Verbindung zum Server hole ich mir ein Token und erzeuge daraus ein Cookie (dafür habe ich folgende Vorlage genommen: http://blog.notdot.net/2010/05/Authenticating-against-App-Engine-from-an-Android-app):
    Code:
    AccountManager accountManager = AccountManager.get( getApplicationContext() );
    accountManager.getAuthToken( account, "ah", false, new GetAuthTokenCallback(), null );
    ...
    HttpGet http_get = new HttpGet( SERVER + "_ah/login?continue=http://localhost/&auth=" + token );
    
    4) Daraus erzeuge ich wiederrum ein Restlet-Cookie und schicke es beim 1. Request mit:
    Code:
    ClientResource cr = new ClientResource( SERVER + "test" );
    cr.getCookies().add( myCookie );
    
    5) Am Server prüfe ich bei den GET, PUT und DELETE Aktionen immer vorher, ob der User eingeloggt ist:
    Code:
    if ( UserServiceFactory.getUserService().isUserLoggedIn() )
    {
    // ...
    }
    

    Jetzt zu meinen Fragen:
    1) Muss ich das Cookie bei jedem Request mitschicken, oder reicht es beim ersten Mal?
    2) Wie kann ich verhindern, dass bei jedem Start der App diese ganze Prozedur neu ausgeführt wird? Kann ich das Cookie irgendwie in den SharedPreferences speichern?
    3) Was mach ich, wenn das Cookie abgelaufen ist bzw. woran erkenn ich das?
    4) Soll ich das Cookie vergessen und einfach jedesmal das Token mitschicken? Das könnte man ja in den Preferences speichern (ist ja nur ein String). Nur zieht dann am Server die Prüfung "isUserLoggedIn", wenn ich nur das Token mitschicke?
    5) Gibts für diese Szenario "Android -> App Engine -> Cookies" irgendein gutes Tutorial?

    Danke
     
  2. MrJack, 08.02.2012 #2
    MrJack

    MrJack Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    67
    Erhaltene Danke:
    10
    Registriert seit:
    14.12.2011
    Phone:
    OnePlus One
    So, bin jetzt bei folgendem Stand:

    Ich habe mir eine eigene serialisierbare Klasse geschrieben, mit deren Hilfe ich meinen Cookie + Benutzer speichern kann:

    Code:
    public class SerializableCookie implements Serializable
    {
        private String name;
        private String value;
        private String domain;
        private String path;
        private int version;
        private String username;
        
        public SerializableCookie( Cookie cookie, String username )
        {
            this.name = cookie.getName();
            this.value = cookie.getValue();
            this.domain = cookie.getDomain();
            this.path = cookie.getPath();
            this.version = cookie.getVersion();
            this.username = username;
        }
        //....
    
    Beim Start der App prüfe ich, ob in den SharedPreferences ein SerializableCookie gespeichert ist. Wenn ja, verwende ich diesen. Wenn nicht, fordere ich den Benutzer auf, einen Google Account auszuwählen.
    Danach hole ich mir mit diesem Account ein Token und dann von der AppEngine ein Cookie, welches ich (zusammen mit dem Benutzername = E-Mail-Adresse) in den SharedPreferences speichere.
    Diesen Cookie übergebe ich bei jedem Request.

    Funktioniert großartig, bis ....
    das Cookie abläuft! Laut Default-Einstellung in der AppEngine ist die Expiration 1 Tag (kann man bis auf 2 Wochen erhöhen).

    Ich müsste also eines der folgenden Vorschläge umsetzen:
    1) Bei jedem Start ein neues Cookie anfordern (möchte ich irgendwie verhindern)
    2) Erkennen, wann das Cookie abgelaufen ist und nur dann ein neues anfordern (wird wahrscheinlich aufwändiger als Punkt 1 sein)
    3) Das Expiration Date der AppEngine auf unendlich setzen (geht das überhaupt und ist das sinnvoll?)
    4) In den SharedPreferences speichern, wann das Cookie ablaufen wird und erst dann ein neues anfordern (Optimalfall?)

    Was kann ich also tun?
     
  3. Tom299, 09.02.2012 #3
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Ich kenn mich mit Cookies nicht aus, aber laut API gibts die Methode:
    Cookie | Android Developers

    Das sollte doch helfen, oder nicht? ;-)
     
    MrJack bedankt sich.
  4. MrJack, 09.02.2012 #4
    MrJack

    MrJack Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    67
    Erhaltene Danke:
    10
    Registriert seit:
    14.12.2011
    Phone:
    OnePlus One
    Omg, ich glaube ich bin blind!
    Danke für den Tipp, so funktioniert's.

    Edit: Ich habe jetzt aber doch noch 1 Problem!
    Im Emulator mit Version 2.2 funktioniert alles, auf meinem Gerät mit Version 4.0 leider nicht. Da bekomme ich beim Auslesen des Tokens immer null zurück:
    Code:
    bundle.getString( AccountManager.KEY_AUTHTOKEN )
    Hats da irgendein Berechtigungsproblem? Ich habe folgende Permissions in der manifest definiert:
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.GET_ACCOUNTS"/>
    <uses-permission android:name="android.permission.USE_CREDENTIALS"/>
     
    Zuletzt bearbeitet: 09.02.2012

Diese Seite empfehlen