Подтвердить что ты не робот

Firebase: Как сохранить зарегистрированного пользователя Android?

Я использую Firebase SimpleLogin для активации аутентификации по электронной почте/паролю. Создание пользователей и последующий вход в систему работают нормально. Тем не менее, всякий раз, когда я покидаю приложение (даже если только на несколько секунд), пользователь никогда не войдет в систему по моему возврату i.e...

authClient.checkAuthStatus(new SimpleLoginAuthenticatedHandler())...

Всегда возвращает нулевого пользователя.

Я не выхожу из системы через API. Также я установил количество дней входа пользователя в систему 21 в консоли Firebase.

В JS-документах я упоминал о параметре mem-me, но я не вижу эквивалента для Android/Java.

Интересно, если я пропущу что-либо в документах или если это невозможно для Android?

Спасибо за вашу помощь,

Neil.

Изменить: добавлен образец кода.

Создание пользователя....

public void registerUserForChat(final MyApplication application, String email, String password) {
    Firebase ref = new Firebase(FIREBASE_URL);
    SimpleLogin authClient = new SimpleLogin(ref);
    authClient.createUser(email, password, new SimpleLoginAuthenticatedHandler() {
        @Override
        public void authenticated(com.firebase.simplelogin.enums.Error error, User user) {
            if(error != null) {
                Log.e(TAG, "Error attempting to create new Firebase User: " + error);
            }
            else {
                Log.d(TAG, "User successfully registered for Firebase");
                application.setLoggedIntoChat(true);
            }
        }
    });
}

Вход пользователя...

public void loginUserForChat(final MyApplication application,  String email, String password) {
    Log.d(TAG, "Attempting to login Firebase user...");
    Firebase ref = new Firebase(FirebaseService.FIREBASE_URL);
    final SimpleLogin authClient = new SimpleLogin(ref);
    authClient.checkAuthStatus(new SimpleLoginAuthenticatedHandler() {
        @Override
        public void authenticated(com.firebase.simplelogin.enums.Error error, User user) {
            if (error != null) {
                Log.d(TAG, "error performing check: " + error);
            } else if (user == null) {
                Log.d(TAG, "no user logged in. Will login...");
                authClient.loginWithEmail(email, password, new SimpleLoginAuthenticatedHandler() {
                    @Override
                    public void authenticated(com.firebase.simplelogin.enums.Error error, User user) {
                        if(error != null) {
                            if(com.firebase.simplelogin.enums.Error.UserDoesNotExist == error) {
                                Log.e(TAG, "UserDoesNotExist!");
                            } else {
                                Log.e(TAG, "Error attempting to login Firebase User: " + error);
                            }
                        }
                        else {
                            Log.d(TAG, "User successfully logged into Firebase");
                            application.setLoggedIntoChat(true);
                        }
                    }
                });
            } else {
                Log.d(TAG, "user is logged in");
            }
        }
    });
}

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

  • Попытка входа в систему пользователя Firebase...
  • Пользователь не выполнил вход. Войдите в систему...
  • Пользователь успешно выполнил вход в Firebase

Если я выйду из приложения, даже на несколько секунд, и вернусь - я вижу тот же журнал.

Одна вещь, которую я заметил, это то, что вызов checkAuthStatus не принимает никаких учетных данных пользователя - я предполагаю, что он просто проверяет наличие локально зарегистрированного пользователя?

Большое значение.

4b9b3361

Ответ 1

[Engineer at Firebase] Чтобы прозрачно обрабатывать постоянные сессии в клиенте Firebase Simple Login Java, вам нужно использовать конструктор с двумя аргументами, который принимает контекст Android, т.е. SimpleLogin(com.firebase.client.Firebase ref, android.content.Context context) каждый раз, когда вы создаете экземпляр Simple Login Java клиент.

См. https://www.firebase.com/docs/java-simple-login-api/javadoc/com/firebase/simplelogin/SimpleLogin.html для полной ссылки на API.

Ответ 2

Правильный способ сделать это - использовать аутентификацию oAuth:

1. The user logs in.
2. You generate an access token(oAuth2).
3. Android app saves the token locally.
4. Each time the comes back to the auth, he can use the token to to log in, unless the token has been revoked by you, or he changed his
password.

К счастью, у firebase есть своя поддержка для этого, docs:

https://www.firebase.com/docs/security/custom-login.html https://www.firebase.com/docs/security/authentication.html

Ответ 3

Другой способ - попробуйте этот код в onCreate:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    // User is signed in
    Intent i = new Intent(LoginActivity.this, MainActivity.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(i);
} else {
    // User is signed out
    Log.d(TAG, "onAuthStateChanged:signed_out");
}