2016-04-29 16 views
3

Ich habe eine Android-App mit einem Login, der Login-Informationen über https zu einem Java-Rest API sendet, die die Anmeldeinformationen überprüft und sendet dann eine Antwort, die angibt, ob die Anmeldung erfolgreich war. Meine Frage ist einfach: Was muss ich tun, damit sich der Benutzer beim Neustart der App nicht erneut anmelden muss?Android, Login mit Rest API

+0

Sie Ihre API einen Auth Schlüssel liefern machen können, die Sie verwenden können Benutzer für zukünftige API-Anforderungen zu authentifizieren. Sie können auch die Gültigkeit dieses Auth-Tokens festlegen. Weitere Informationen finden Sie im JSON-Webtoken. –

Antwort

3

Es gibt viele Möglichkeiten, mit einmaliger Anmeldung umzugehen, es hängt viel davon ab, wie die Architektur auf der Serverseite implementiert wird, damit es funktioniert. Normalerweise sind Login-API closely coupled aus Sicherheitsgründen. Lass mich zum Beispiel was ich meine von closely coupled.

Wie Sie einmal um Mobile App Arbeit Login wollen und das nächste Mal Benutzer öffnet die Mobile app Sie wollen nicht wieder mit SignIn Bildschirm Benutzer aufzufordern. und sicherlich möchten Sie nicht die vertraulichen Informationen wie Username und Password auf Mobile App als persistente Daten speichern, wie es leicht von Android-Gerät abgerufen werden kann. also was du tust.

Nehmen wir an, Sie übergeben Anmeldeinformationen mit einer deviceID eindeutig an die Android Device. Etwas wie unten gezeigt. finden Sie die JSON Daten an die

{ 
    "username": "[email protected]", 
    "password": "it's not a secret", 
    "deviceId": "123456789" 
} 

LoginAPI Nun, wie Sie die Login Anmeldeinformationen speichern möchten gesendet nicht tun, werden Server einen zufälligen alphanumerischen String Pass es Ihnen in Reaktion erzeugen jedes Mal, wenn Sie auf dem Mobile anmelden App.

{ 
    "Success": true, 
    "SuccessMessage": "credentials are correct, really!", 
    "ErrorMessage": null, 
    "Date": "dd/mm/yyyy", 
    "token": "1eghe4qha23aehraeh456789" // now this is a nasty String 
} 

Sie können jetzt die date und die token in Mobile App als persistente Daten speichern. Wenn der Benutzer das nächste Mal die App öffnet, können Sie den Benutzer den Bildschirm SignIn umgehen lassen, und im Hintergrund können Sie überprüfen, ob die Benutzer-Token-ID korrekt ist, indem Sie diese an den Server senden.Sie können SharedPreferences oder erstellen Sie wählen eine file und es

dort speichern kann
{ 
    "API_TYPE": "login", 
    "deviceId": "123456789", 
    "token": "1eghe4qha23aehraeh456789" 
} 

Server dieses Token-ID überprüfen gegen die deviceID zu überprüfen, ob dies der richtige Token für das Gerät und reagieren war.

Sie können fragen, warum überprüfen wir wieder die token, wie dies vom Server an erster Stelle mit der Angabe der Anmeldeinformationen richtig gesendet wurde. Ich stimme zu, dass Sie einen Punkt haben, sagen wir, es ist eine ausfallsichere Bedingung, wenn der Benutzer das Passwort von der Website ändert oder etwas, das das Token auf dem Server ändert, ändert, wenn der Server das Token verweigert Sie bitten den Benutzer, sich erneut anzumelden.

Dadurch wird sichergestellt, dass ein Benutzer zu einem beliebigen Zeitpunkt in nur einem Android Device angemeldet ist.

+1

Danke für Ihre Hilfe, dies scheint der beste Ansatz zu sein, den ich gesehen habe. Ich habe eine Frage dazu, ist es nicht schlecht, einen Token zu lange auf einem Gerät zu speichern? Würden Sie den folgenden Ansatz immer dann empfehlen, wenn der Benutzer nach der ersten Anmeldung wieder zur App zurückkehrt: 1. Der Benutzer öffnet die App. Der Token und die Geräte-ID in den gemeinsamen Einstellungen werden an den Server 2 gesendet Der Server verifiziert die Geräte-ID und Token-ID mit der Geräte-ID und der Token-ID, die auf dem Server gespeichert sind ... –

+1

3. Der Server erzeugt dann ein neues Token und wenn Schritt 2 erfolgreich war, sendet er ein neues Token mit Die Erfolgsmeldung 4. Die Token-ID wird dann in den gemeinsamen Einstellungen mit der neuen vom Server erhaltenen aktualisiert. Wäre das übertrieben? Würden Sie auch empfehlen, den Token-Check über SSL durchzuführen? –

+0

@BenC, Sie haben meine Aufmerksamkeit, die Sie tatsächlich einige der Schleifenlöcher in diesem Ansatz gefunden haben. Was Sie vorgeschlagen haben ist trotzig kann getan werden und tut auch die "SSL" -Option. Denken Sie daran, dass ich einen "Date" -Schlüssel hinzugefügt habe, der vom Server als Antwort zur Verfügung gestellt wird. Dieses Datum kann verwendet werden, um zu überprüfen, wann das "SignIn" das letzte Mal erfolgreich stattgefunden hat, und Sie können das Token nach 10, 20 oder 30 Tagen ungültig machen und den Benutzer erneut zum SignIn bitten –

0

Sie können die Anmeldeinformationen nach der ersten Anmeldung speichern. Also wenn der Benutzer App neu starten, können Sie automatisch die Anfrage Authentifizierung.

können Sie wählten die beste Option, um Speicher die Anmeldeinformationen des doc mit: Data-Storage

Diese einfache, aber vielleicht nicht der beste Weg, dies zu tun.

+0

Wenn Sie in Ihrer Authentifikation Kennwörter verwenden, denken Sie daran, vor dem Speichern zu verschlüsseln. – Adley

0

Ich habe das gleiche problme, und ich bekam einen Json Daten vom Server wie dieser

{"error":0,"message":"ok","token":"7c75015e92e40511911e34752ee456e1","execute_time":"0.2723"} 

so halte ich die StuToken in SharedPreferences, und wenn meine app starten, klicken Sie die StuToken es nicht gibt, wie dieses

Map<String, String> loginInfo = InfoUtil.getLoginInfo(MainActivity.this); 
    if (loginInfo != null) { 
     if (loginInfo.get("StuToken") != null) { 
      getStuInfo(loginInfo.get("StuToken")); 
      Toast.makeText(MainActivity.this, "登录状态", Toast.LENGTH_SHORT).show(); 
     } else { 
      initIntent(LoginActivity.class); 
      this.finish(); 
     } 
    } else { 
     initIntent(LoginActivity.class); 
     this.finish(); 
    } 
} 

hofft, dass das für Sie arbeitet

0

können Ihnen gemeinsame Vorliebe verwenden, um die Werte des Benutzers zu speichern und zu prüfen, ob der Benutzer bereits angemeldet ist oder nicht. Sie können dies folgen Link.

0

Probieren Sie diesen Code in Ihrer SplashScreen-Aktivität aus. Sie können einen Wert in einem sharedPrefence speichern, um zu überprüfen, ob der Benutzer angemeldet ist oder nicht.

public class SplashActivity extends AppCompatActivity { 

    private static final long TIME_OUT_MILI = 3000; 
    private SharedPreferences mAppPreferences; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_splash); 
     mAppPreferences = AppUtil.getAppPreferences(this); 

     new Handler().postDelayed(new Runnable() { 

      @Override 
      public void run() { 
       if (mAppPreferences.getBoolean("is_Logged_in", false)) { 

        startActivity(new Intent(SplashActivity.this, MainActivity.class)); 

       } else { 

        startActivity(new Intent(SplashActivity.this, LoginActivity.class)); 

       } 
       finish(); 
      } 
     }, TIME_OUT_MILI); 
    } 


} 

In Your LoginActivity ist dies zu tun:

public class LoginActivity extends AppCompatActivity { 
private SharedPreferences mAppPreferences; 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_login); 
      SharedPreferences.Editor editor = mAppPreferences.edit(); 
editor.putBoolean(Constants.SETTINGS_IS_LOGGED_IN, true); 
         editor.commit(); 
} 
}