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

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

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

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

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

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

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

Спасибо за помощь

Нил.

Edit: добавил пример кода.

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

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 сначала проверяет, есть ли зарегистрированный пользователь, а если нет, выполняет вход в систему. Обратите внимание, что каждый раз, когда я запускаю приложение, я вижу журнал....

  1. попытка входа в систему пользователя Firebase...
  2. ни один пользователь не вошел в систему. Будет логин...
  3. пользователь успешно вошел в Firebase

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

одна вещь, которую я заметил, что вызов checkAuthStatus не принимает никаких учетных данных пользователя-I предположим, он просто проверяет любой локальный вход в систему пользователя?

ценится.

3 ответов


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

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


еще один способ - попробуйте этот код 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");
}

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


правильный способ сделать это-использовать аутентификацию 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