Правильно выйти из приложения Android
Я разрабатываю небольшое приложение для Android, и в основном до сих пор у него только функции входа и выхода. Я использую Firebase для хранения пользовательских данных, а также для проверки подлинности.
Итак, у меня есть вход в систему, и он аутентифицирует пользователей так, как должен, и я выхожу из работы в том смысле, что он unauthenticates
пользователей. Но есть ли что-нибудь, что я должен сделать из приложения, чтобы убить сессию?
if (id == R.id.action_log_out) {
ref.unauth(); //End user session
startActivity(new Intent(MainActivity.this, LoginActivity.class)); //Go back to home page
finish();
}
Будет ли это работать, как я полагаю? Очевидно, если кто-то выйдет из системы, они не смогут нажать кнопку "Назад" и волшебным образом вернуться на последнюю страницу без повторного входа.
Ответы
Ответ 1
Когда Firebase аутентифицирует пользователя (или вы аутентифицируете пользователя с помощью Firebase), он сохраняет токен для этого пользователя в локальном хранилище на вашем устройстве. Это происходит, когда вы вызываете один из методов authWith...
(конечно, только если он успешно аутентифицирует пользователя).
Вызов ref.unauth();
немедленно удаляет этот токен из локального хранилища.
Правильно реализованный поток не будет автоматически повторно аутентифицировать их, когда пользователь нажимает кнопку "Назад", но это зависит от потока, который вы реализуете (который отсутствует в вашем вопросе и, скорее всего, слишком много кода).
Ответ 2
От Firebase docs
https://firebase.google.com/docs/auth/android/custom-auth
вызовите этот FirebaseAuth.getInstance(). signOut();
Ответ 3
Я вижу 2 варианта проблемы, которые у нас есть с помощью кнопки "Назад" после выхода из системы:
В вашей учетной записи LoginActivity, которая должна быть вашей деятельностью для запуска, переопределите метод onBackPressed и оставьте его пустым:
@Override
public void onBackPressed() {
// empty so nothing happens
}
Или/и вы можете добавить LoginActivityIntent в свой LogoutActivty, если user == null.
Таким образом, всякий раз, когда пользователь, не прошедший аутентификацию, приземляется на активность, он мгновенно перенаправляется на LoginActivity, хотя это выглядит странно.
mAuth = FirebaseAuth.getInstance();
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// User is signed in
Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
} else {
// User is signed out
Log.d(TAG,"onAuthStateChanged:signed_out");
startActivity(new Intent(LogoutActivity.this, LoginActivity.class));
}
// ...
}
};
Первый вариант проще, но я предполагаю, что если вы примените оба на стороне сохранения ^^ Im кодирования в течение 2 недель, так исправьте меня, если я ошибаюсь.
Ответ 4
Удалить маркеры и идентификаторы экземпляров
String authorizedEntity = PROJECT_ID;
String scope = "GCM";
FirebaseInstanceID.getInstance(context).deleteToken(authorizedEntity,scope);
Вы также можете удалить сам экземпляр экземпляра, включая все связанные токены. При следующем вызове getInstance() вы получите новый идентификатор экземпляра:
FirebaseInstanceID.getInstance(context).deleteInstanceID();
String newIID = InstanceID.getInstance(context).getId();