0Pricing
Android Academy · Урок

Аутентификация Firebase

Вход по электронной почте и через Google

«Аутентификация Firebase» — бесплатный урок Android Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Android Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Android Academy содержит 4 уроков всего.

Зачем нужен Firebase Auth

Firebase Authentication берёт на себя сложные части входа пользователей: безопасное хранение паролей, обновление токенов, восстановление аккаунта и работу со множеством провайдеров (электронная почта, Google, Apple, телефон, анонимный вход).

Вместо создания серверов для входа вы вызываете несколько API и получаете подтверждённого пользователя FirebaseUser. На этом уроке вы реализуете вход по электронной почте и паролю, а также вход через Google.

Включение способов входа

До написания кода включите нужных провайдеров в консоли Firebase:

  • Откройте раздел Аутентификация → Способ входа.
  • Включите параметр Электронная почта и пароль.
  • Включите параметр Google (выберите контактный адрес электронной почты).

Для входа через Google также необходимо добавить отпечаток SHA-1 приложения в настройках проекта, иначе вход завершится ошибкой разработчика.

Получение экземпляра FirebaseAuth

Точкой входа служит Firebase.auth. Он предоставляет доступ к текущему пользователю и методам создания аккаунтов, входа и выхода.

auth.currentUser имеет значение null, если никто не вошёл в систему, — это быстрый способ решить, какой экран показать при запуске.

import com.google.firebase.Firebase
import com.google.firebase.auth.auth

val auth = Firebase.auth

fun isLoggedIn(): Boolean {
    return auth.currentUser != null
}

Создание аккаунта

Зарегистрируйте нового пользователя с помощью createUserWithEmailAndPassword. Эта функция возвращает задачу, но в коде с сопрограммами её можно обработать с помощью await() (из kotlinx-coroutines-play-services).

После успешного выполнения пользователь сразу входит в систему.

import com.google.firebase.Firebase
import com.google.firebase.auth.auth
import kotlinx.coroutines.tasks.await

suspend fun register(email: String, password: String): Result<Unit> {
    return try {
        Firebase.auth
            .createUserWithEmailAndPassword(email, password)
            .await()
        Result.success(Unit)
    } catch (e: Exception) {
        Result.failure(e)
    }
}

Вход по электронной почте

Для входа существующего пользователя используется signInWithEmailAndPassword. Структура кода аналогична регистрации.

Если обернуть вызов в try/catch, можно показать понятные сообщения об ошибках — неверном пароле, отсутствии пользователя или некорректном адресе электронной почты.

import com.google.firebase.Firebase
import com.google.firebase.auth.auth
import com.google.firebase.auth.FirebaseUser
import kotlinx.coroutines.tasks.await

suspend fun login(email: String, password: String): FirebaseUser? {
    val result = Firebase.auth
        .signInWithEmailAndPassword(email, password)
        .await()
    return result.user
}

Экран входа в Compose

Свяжите аутентификацию с небольшим экраном Compose. Храните электронную почту и пароль в состоянии, вызывайте приостанавливаемые функции из области сопрограммы и показывайте ошибки.

@Composable
fun LoginScreen(onLoggedIn: () -> Unit) {
    var email by remember { mutableStateOf("") }
    var password by remember { mutableStateOf("") }
    var error by remember { mutableStateOf<String?>(null) }
    val scope = rememberCoroutineScope()

    Column(Modifier.padding(16.dp)) {
        TextField(email, { email = it }, label = { Text("Email") })
        TextField(password, { password = it }, label = { Text("Password") })
        error?.let { Text(it, color = Color.Red) }
        Button(onClick = {
            scope.launch {
                val user = login(email, password)
                if (user != null) onLoggedIn() else error = "Login failed"
            }
        }) { Text("Sign in") }
    }
}

Чтение текущего пользователя

FirebaseUser содержит сведения о личности: uid (стабильный уникальный идентификатор), email, displayName и photoUrl.

Используйте uid как ключ при сохранении данных этого пользователя в Firestore — он гарантированно уникален и не изменяется.

import com.google.firebase.Firebase
import com.google.firebase.auth.auth

fun describeUser() {
    val user = Firebase.auth.currentUser ?: return
    println("UID: ${user.uid}")
    println("Email: ${user.email}")
    println("Name: ${user.displayName ?: "(none)"}")
}

Наблюдение за состоянием аутентификации

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

Это особенно удобно для автоматического перехода между экраном входа и главным экраном.

import com.google.firebase.Firebase
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.auth

val listener = FirebaseAuth.AuthStateListener { auth ->
    val user = auth.currentUser
    if (user == null) {
        println("Signed out -> show login")
    } else {
        println("Signed in as ${user.email}")
    }
}

// Attach and detach with lifecycle
Firebase.auth.addAuthStateListener(listener)
// Firebase.auth.removeAuthStateListener(listener)

Вход через Google с помощью Credential Manager

Современный способ реализовать вход через Google — использовать API Credential Manager. Сначала запросите токен идентификации Google, а затем обменяйте его на учётные данные Firebase.

Ключевой шаг — создать учётные данные GoogleAuthProvider из полученного токена идентификации и передать их в signInWithCredential.

import com.google.firebase.Firebase
import com.google.firebase.auth.GoogleAuthProvider
import com.google.firebase.auth.auth
import kotlinx.coroutines.tasks.await

suspend fun firebaseSignInWithGoogle(idToken: String) {
    // idToken comes from Credential Manager / Google Identity
    val credential = GoogleAuthProvider.getCredential(idToken, null)
    Firebase.auth.signInWithCredential(credential).await()
}

Выход из системы

Для выхода из системы достаточно одного вызова: auth.signOut(). Он удаляет локальные данные пользователя и вызывает ваш обработчик состояния аутентификации.

При входе через Google также можно очистить состояние Credential Manager, чтобы при следующем входе снова отображался экран выбора. После выхода currentUser становится равным null.

import com.google.firebase.Firebase
import com.google.firebase.auth.auth

fun logout() {
    Firebase.auth.signOut()
    // currentUser is now null; your AuthStateListener fires
}

Обработка ошибок аутентификации

При сбоях аутентификации возникают типизированные исключения, которые можно обрабатывать по отдельности:

  • FirebaseAuthInvalidUserException — пользователь не найден или отключён.
  • FirebaseAuthInvalidCredentialsException — неверный пароль или некорректный адрес электронной почты.
  • FirebaseAuthUserCollisionException — этот адрес электронной почты уже зарегистрирован.

Преобразуйте их в понятные сообщения вместо отображения необработанных трассировок стека.

import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException
import com.google.firebase.auth.FirebaseAuthUserCollisionException

fun messageFor(e: Throwable): String = when (e) {
    is FirebaseAuthInvalidCredentialsException -> "Wrong email or password"
    is FirebaseAuthUserCollisionException -> "That email is already in use"
    else -> "Something went wrong, try again"
}

Быстрая проверка

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

Итоги: аутентификация

Теперь вы умеете аутентифицировать пользователей с помощью Firebase:

  • Включайте провайдеры в консоли и добавляйте свой SHA-1 для Google.
  • Используйте Firebase.auth вместе с createUserWithEmailAndPassword / signInWithEmailAndPassword.
  • Для входа через Google получите токен идентификации, создайте учётные данные GoogleAuthProvider и вызовите signInWithCredential.
  • Читайте сведения о пользователе через currentUser, используя uid как ключ данных.
  • Реагируйте на изменения с помощью AuthStateListener, а для выхода используйте signOut().

Далее: сохранение данных пользователя в Cloud Firestore.

Часто задаваемые вопросы

Урок «Аутентификация Firebase» бесплатный?

Да — полный текст урока «Аутентификация Firebase» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Android Academy, подпишись на CoddyKit PRO. Курс Android Academy содержит 4 уроков всего.

Чему я научусь в уроке «Аутентификация Firebase»?

Вход по электронной почте и через Google Ты практикуешь Android Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Android Academy?

Предыдущий опыт не требуется. Android Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Аутентификация Firebase»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Android Academy?

Да. Каждый урок Android Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Настройка Firebase
  2. Аутентификация Firebase
  3. Основы Cloud Firestore
  4. Отправка уведомлений через Cloud Messaging
← Назад к Android Academy