Firebase.auth.CurrentUser никогда не имеет значения null

# #android #firebase #kotlin #firebase-authentication

Вопрос:

Мне нужно получить значение «null» из функции Firebase.auth.CurrentUser, но она возвращает пользователя по умолчанию.

 val auth = Firebase.auth
val currentUser = auth.currentUser
if (currentUser != null) {
        val action = SignInFragmentDirections.actionSignInFragmentToTransactionsFragment(currentUser)
        findNavController().navigate(action)
    }
 

Поскольку значение auth.currentUser никогда не возвращает null, мое приложение всегда переходит на другой экран и не позволяет регистрировать нового пользователя.
Почему это происходит и как я могу получить значение null при вызове auth.сurrentUser ?

Комментарии:

1. Вам придется выйти из системы пользователя, чтобы сделать его пустым.

2. Я создал пользователя в Firebase, но после этого удалил его в консоли Firebase, но auth.currentUser возвращает ненулевое значение…

3. Пожалуйста, не оставляйте комментариев о статусе вашего вопроса в заголовке в дальнейшем. Здесь, в переполнении стека, система отслеживает статус вопросов на основе ответов, которые она получает автоматически.

4. О, я этого не знал, спасибо за информацию.

Ответ №1:

Я понял это — если я вошел в приложение и не вызвал auth.signOut метод — я удалил учетную запись только с консоли Firebase, по этой причине токен аутентификации некоторое время сохранялся локально и по этой причине auth.currentUser возвращал значение, отличное от нуля. Когда я удалил приложение (и добавил логику выхода в свое приложение позже) и переустановил его, все работает правильно.

Ответ №2:

«Не позволяет зарегистрировать нового пользователя»

Мне кажется, вы пытаетесь создать несколько пользователей с помощью Android SDK, но он не создан для этого. Как только вы войдете в систему, вам придется выйти, чтобы создать другого пользователя, потому что только один пользователь может быть зарегистрирован в одном приложении (по крайней мере, в одном проекте Firebase).

Если вы хотите создать несколько учетных записей, вы можете сделать это непосредственно с консоли Firebase. Однако если ваше приложение предназначено для использования администраторами или привилегированными пользователями, которые могут создавать новые учетные записи, и вы не хотите предоставлять им доступ к консоли Firebase, вам придется использовать что-то вроде облачных функций или вашего собственного сервера.

Там вы можете использовать SDK администратора Firebase для создания новых пользователей. Простые функции могут выглядеть так:

 exports.createNewUser = functions.https.onCall((data, context) => {
  return admin
  .auth()
  .createUser({
    email: data.email
  })
  .then((userRecord) => {
    // See the UserRecord reference doc for the contents of userRecord.
    console.log('Successfully created new user:', userRecord.uid);
    return userRecord.uid
  })
  .catch((error) => {
    console.log('Error creating new user:', error);
  });
});
 

Вы можете вызвать функцию из своего приложения следующим образом:

 private fun createUser(name: String, email: String): Task<String> {
    // Create the arguments to the callable function.
    val data = hashMapOf(
        "name" to name,
        "email" to email
    )

    return functions
            .getHttpsCallable("createNewUser")
            .call(data)
            .continueWith { task ->
                val result = task.result?.data as String
            }
}
 

Вы можете прочитать больше о вызываемых функциях здесь.

Обратите внимание, что я просто запустил метод создания пользователя в облачных функциях, но в идеале вы должны проверить, какой пользователь вызывает функцию ( context.auth имеет информацию), и убедиться, что только авторизованный пользователь может использовать эту функцию.

Комментарии:

1. Спасибо вам за подробный ответ! Но я имел в виду, что значение auth.currentUser никогда не было нулевым, и по этой причине мой «Экран входа» не отображается, потому if что оператор истинен, а его тело переходит к другому действию 🙂