2016-04-29 3 views
3

У меня есть приложение для Android с регистрацией, которая отправляет регистрационную информацию через https в java rest api, которая проверяет учетные данные для входа, а затем отправляет ответ, в котором указано, был ли вход успешно. Мой вопрос прост, что я должен сделать, чтобы убедиться, что пользователю не нужно снова войти в систему при перезапуске приложения?Android, login using Rest API

+0

Вы можете сделать свой API предоставить ключ идентификации, которую можно использовать для проверки подлинности пользователя для будущих запросов API. вы также можете установить действительность этого токена Auth. Для получения дополнительной информации ознакомьтесь с веб-маркером JSON. –

ответ

3

Существует много способов иметь дело с однократным входом в систему, это зависит от того, как архитектура реализована на стороне сервера, чтобы заставить ее работать. Обычно API для входа - closely coupled по соображениям безопасности. позвольте мне пример, что я имею в виду под номером closely coupled.

Как вы хотите, чтобы LoginMobile App работы один раз, и в следующий раз, когда пользователь открывает Mobile app вы не хотите, чтобы подсказать пользователь SignIn экрана снова. и, конечно же, вы не хотите сохранять конфиденциальную информацию, такую ​​как Username, и Password в мобильном приложении в качестве постоянных данных, так как его можно легко извлечь из устройства Android. так, что вы делаете.

Предположим, вы прошли регистрационные данные с deviceID, уникальными для Android Device. Что-то вроде показано ниже. Ниже данные JSON отправляемые на LoginAPI

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

Теперь, когда вы не хотите, чтобы сохранить Login учетные данные, сервер будет генерировать случайные буквенно-цифровой String передать его вам в ответ каждый раз при входе в Mobile Приложение.

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

теперь вы можете сохранить date и token в Mobile App в качестве постоянных данных. Итак, в следующий раз, когда ваш пользователь откроет приложение, вы можете позволить пользователю обойти экран SignIn, а в фоновом режиме вы можете проверить, правильно ли установлен идентификатор токена пользователей, отправив его на сервер, что-то вроде этого.Вы можете выбрать SharedPreferences или создать file и сохранить его там

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

Сервер может проверить этот токен против deviceID, чтобы проверить, было ли это правильный маркер для устройства и реагировать.

Вы можете спросить, почему мы снова проверяем token, поскольку это было отправлено сервером на первом месте, указав, что учетные данные были правильными. Я согласен, что у вас есть точка, скажем, что это условие безопасности при сбое, если пользователь изменяет пароль с веб-сайта или что-то, что приводит к изменению токена на сервере для изменения этого пользователя, если сервер отрицает токен, предоставленный вы просто попросите пользователя снова войти в систему.

Это будет следить за тем, чтобы пользователь входил в систему только один Android Device в любой данный момент времени.

+1

Спасибо за помощь, это, кажется, лучший подход, который я видел. У меня есть один вопрос об этом, хотя, не правда ли, что слишком долго хранить токен на устройстве? Вы бы рекомендовали следующий подход каждый раз, когда пользователь возвращается в приложение после первого входа в систему: 1. Пользователь открывает приложение, идентификатор токена и устройства, сохраненный в общих настройках, отправляется на сервер 2 . Сервер проверяет идентификатор устройства и идентификатор токена с идентификатором и идентификатором идентификатора устройства, хранящимся на сервере ...... –

+1

3. Затем сервер генерирует новый токен, и если шаг 2 был успешным, он отправляет новый токен вместе с сообщение об успешности 4. Идентификатор токена затем обновляется в общих предпочтениях с новым, полученным от сервера. Будет ли это излишним? Кроме того, вы бы порекомендовали выполнить проверку токена через ssl? –

+0

@BenC. Вы обращаете внимание на то, что вы на самом деле выявили некоторые петлевые отверстия в этом подходе. То, что вы предложили, вызывающе может быть сделано, а также опция «SSL». Помните, что я добавил ключ «Дата», который будет предоставлен сервером в качестве ответа. Эта дата может быть использована для проверки того, когда последний раз «SignIn» прошел успешно, и вы можете аннулировать токен через 10, 20 или 30 дней и снова попросить пользователя «SignIn» –

0

Вы можете сохранить учетные данные после первого входа в систему. Итак, когда пользователь перезагрузит приложение, вы можете автоматически сделать запрос auth.

Вы можете выбрать оптимальный вариант для хранения учетных данных с помощью док: Data-Storage

Это просто, но, возможно, не самый лучший способ сделать это.

+0

Если вы используете пароли в своем auth, не забудьте зашифровать перед хранением. – Adley

0

У меня есть один и тот же problme, и я получил данные JSON от сервера, как этого

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

так я держу StuToken в SharedPreferences, и когда мой старт приложения, проверьте StuToken существует ли она, как это

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(); 
    } 
} 

надежда, что будет работает для вас

0

вы можете использовать общие предпочтения для хранения значений пользователя и проверить будет ли пользователь уже зарегистрирован или нет. Вы можете следить за этим Link.

0

Пробуйте этот код в своей деятельности SplashScreen. Вы можете сохранить значение в sharedPrefence, чтобы проверить, зарегистрирован ли пользователь или нет.

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); 
    } 


} 

В Вашем LoginActivity делать это:

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(); 
} 
}