2015-08-21 13 views
6

Mam RestAPI, który po uruchomieniu uwierzytelnia użytkownika. Ten api jest narażony na działanie aplikacji Android i ios, które trafiają w ten api, aby umożliwić użytkownikowi logowanie się do naszej aplikacjiJak zalogować się tylko z jednego urządzenia na raz?

Moje żądanie jest następujące. 1) Jeśli użytkownik ma telefon komórkowy, abc telefon z IMEI "abc1234". Loguje się z tego telefonu. Teraz, jeśli spróbuje się zalogować z drugiego telefonu, nie powinno mu się zezwalać na logowanie z drugiego telefonu. Najpierw powinien wylogować się z urządzenia abc.

teraz jest kilka komplikacji 1) jeśli użytkownik jest zalogowany z abc. Bez wylogowania formatuje swój telefon lub odinstalowuje aplikację. Jak powinienem obsługiwać logowanie z tego samego urządzenia lub z innego urządzenia?

Zasadniczo chcę wiedzieć o strategiach lub dobrych praktykach w tego typu scenariuszach.

+0

automatyczne wylogowanie po 5 minut? Wyraźnie wygasaj token logowania co 5 minut, chyba że użytkownik wykona jakąś akcję na telefonie. W takim przypadku odnów token na następne 5 minut. – Rohit5k2

+1

Najlepsze praktyki zostały uwzględnione w sytuacjach, w których telefon użytkownika jest zagubiony i nadal jest zalogowany. Odmawianie logowania to oczywiście utrata potencjału w tym przypadku! Zacznę od wymieniania wszystkich możliwych sytuacji i ważenia zalet i wad każdej powierzchni! –

+0

tak Narasimhan. te scenariusze są tym, czego szukam. użytkownik jest zalogowany i jego telefon jest zgubiony/formatuje/odinstaluj aplikację. jak sobie poradzę z takimi sytuacjami. jednym z nich jest to, że jeśli użytkownik loguje się z drugiego urządzenia, to jest on automatycznie wylogowywany z pierwszego urządzenia. Drugie rozwiązanie polega na tym, że jeśli jest zalogowany z 1 miejsca i próbuje później zalogować się z innego miejsca, należy o tym poinformować pocztą elektroniczną. ale muszę przechowywać identyfikator urządzenia w db również – iGod

Odpowiedz

1

Witam, możesz zrobić jedną rzecz. Śledź status logowania użytkownika. jak

  1. podczas logowania użytkownika dodać wpis, który użytkownik jest aktywny lub zalogować
  2. teraz, gdy użytkownik próbuje zalogować się z innym urządzeniem w tym czasie sprawdzić, czy użytkownik jest login/aktywny, czy nie. jeśli użytkownik jest aktywny, nie zezwalaj na logowanie i wyświetlanie komunikatu wylogowanego ze starego urządzenia. Możesz również automatycznie wylogować się z funkcji ostatniego urządzenia.
  3. Podczas wylogowania użytkownika w tym czasie zmień status użytkownika aktywny/zaloguj się na nieaktywny/wyloguj się, dzięki czemu możesz nim zarządzać.

Musisz przekazać ten status użytkownika za pomocą usługi logowania lub interfejsu API w Androidzie oraz na stronie internetowej, którą możesz bezpośrednio sprawdzić w DB.

+0

W twoim przypadku. jeśli po kroku 1 użytkownik formatuje aplikację, wówczas jego status logowania jest ustawiony jako aktywny/login. Wtedy nie ma innego sposobu, aby się zalogować. – iGod

+0

Możesz poprosić użytkownika o wylogowanie ze starego urządzenia podczas próby zalogowania się z innego urządzenia. jak na facebooku i Gmailu, gdy zmieniasz hasło, pytają cię: "Czy chcesz się wylogować z innych urządzeń?" tak samo jak możesz to zrobić. –

+0

Dobry pomysł, ale to nie pasuje do mojego żądania. – iGod

0

Spróbuj zapisać zmienną binarną. Które będą oznaczone jako 0, a użytkownik będzie mógł się zalogować. Po zalogowaniu, wartość będzie zmiana na 1 i na zmianę wylogowania go z powrotem na 0. użytkownik będzie mógł zalogować się tylko wtedy, gdy wartość znaku logiczną 0.

+0

W twoim przypadku. jeśli użytkownik sformatuje aplikację po udanym logowaniu, zawsze będzie miał wartość logiczną jako 1. – iGod

+0

Następnie ustaw boolean na 0, jeśli pozostanie 1 przez kilka dni. –

+0

Więc problem został rozwiązany? –

2



Proponuję, aby utrzymać sesja logowania. Ilekroć pojawi się pomyślne logowanie, użytkownik powinien podać unikalny identyfikator sesji. Ten identyfikator sesji można następnie wykorzystać do dalszych żądań/połączeń od użytkownika.

Dla scenariusza logowania użytkownika z innego numeru aktywna sesja oznaczy to drugie żądanie logowania jako nieprawidłowe.

Zachowaj mechanizm starzenia dla każdej sesji. W ten sposób nieaktywna sesja, spowodowana odłączeniem lub wyłączeniem telefonu, zostanie zakończona.

+0

Jak utrzymam unikalną sesję, gdy użytkownik zaloguje się przy użyciu Androida lub iPhone'a. – iGod

+0

Możesz użyć numeru telefonu i imei urządzenia, aby wygenerować unikatowy ciąg znaków. Ten ciąg identyfikuje bieżącą sesję utworzoną przez ten login. Zwróć to użytkownikowi jako znak pomyślnego zalogowania. Możesz zachować go w tabeli na podstawie identyfikatora użytkownika. – g4th

8

Dobra praktyka byłoby pozwolić login użytkownika z drugiego urządzenia i wylogowanie go od pierwszego urządzenia byłoby lepiej z doświadczenia użytkownika, jak również będzie łatwo obsługiwać np

Zalogowałem z DeviceId A (aktualizacja Deviceid w dB w stosunku do użytkownika) potem spróbuj zalogować się z DeviceId B (ponownie aktualizować Deviceid nadpisanie poprzedniej Deviceid w dB przeciwko użytkownika)

teraz Gdybym złożyć wniosek DeviceId A, dopasować DeviceID w dB, zwróci fałszywy. Wyślij użytkownika z powrotem do strony logowania.

1

Wpisz SharedPreferences do sporządzania roztworu,

EG.

public class Pref_Storage { 
    private static SharedPreferences sharedPreferences = null; 

    public static void openPref(Context context) { 
     sharedPreferences = context.getSharedPreferences(context.getResources().getString(R.string.app_name), 
       Context.MODE_PRIVATE); 
    } 

    public static void deleteKey(Context context, String key) { 
     HashMap<String, String> result = new HashMap<String, String>(); 

     Pref_Storage.openPref(context); 
     for (Entry<String, ?> entry : Pref_Storage.sharedPreferences.getAll() 
       .entrySet()) { 
      result.put(entry.getKey(), (String) entry.getValue()); 
     } 

     boolean b = result.containsKey(key); 
     if (b) { 
      Pref_Storage.openPref(context); 
      Editor prefsPrivateEditor = Pref_Storage.sharedPreferences.edit(); 
      prefsPrivateEditor.remove(key); 

      prefsPrivateEditor.commit(); 
      prefsPrivateEditor = null; 
      Pref_Storage.sharedPreferences = null; 
     } 
    } 

    public static void setDetail(Context context, String key, String value) { 
     Pref_Storage.openPref(context); 
     Editor prefsPrivateEditor = Pref_Storage.sharedPreferences.edit(); 
     prefsPrivateEditor.putString(key, value); 

     prefsPrivateEditor.commit(); 
     prefsPrivateEditor = null; 
     Pref_Storage.sharedPreferences = null; 
    } 

    public static Boolean checkDetail(Context context, String key) { 
     HashMap<String, String> result = new HashMap<String, String>(); 

     Pref_Storage.openPref(context); 
     for (Entry<String, ?> entry : Pref_Storage.sharedPreferences.getAll() 
       .entrySet()) { 
      result.put(entry.getKey(), (String) entry.getValue()); 
     } 

     boolean b = result.containsKey(key); 
     return b; 
    } 

    public static String getDetail(Context context, String key) { 
     HashMap<String, String> result = new HashMap<String, String>(); 

     Pref_Storage.openPref(context); 
     for (Entry<String, ?> entry : Pref_Storage.sharedPreferences.getAll() 
       .entrySet()) { 
      result.put(entry.getKey(), (String) entry.getValue()); 
     } 

     String b = result.get(key); 
     return b; 

    } 
} 

Zastosowanie:

przed check logowanie login_flag:

if (Pref_Storage.checkDetail(getApplicationContext(), "login_flag")) 
{ 
    // Home Screen 
} 
else 
{ 
    //Display Login Screen 
} 

Po zalogowaniu ustawić login_flag:

Pref_Storage.setDetail(getApplicationContext(), "login_flag", "0"); 
Powiązane problemy