Анонимная аутентификация с помощью Firebase в Android

С помощью Firebase Authentication можно создавать и использовать временные анонимные аккаунты для аутентификации в Firebase. Эти временные анонимные аккаунты можно использовать, чтобы разрешить пользователям, которые ещё не зарегистрировались в вашем приложении, работать с данными, защищенными правилами безопасности. Если анонимный пользователь решит зарегистрироваться в вашем приложении, вы можете связать его учетные данные с анонимным аккаунтом, чтобы он мог продолжать работать со своими защищенными данными в будущих сеансах.

Подготовка

  1. Если вы ещё этого не сделали, добавьте Firebase в проект для Android.
  2. В файле Gradle на уровне модуля (приложения) (обычно это <project>/<app-module>/build.gradle.kts или <project>/<app-module>/build.gradle) добавьте зависимость для библиотеки Firebase Authentication для Android. Для управления версиями библиотек рекомендуется использовать Firebase Android BoM.
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:35.1.0"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    }

    Благодаря Firebase Android BoM в вашем приложении всегда будут использоваться совместимые версии библиотек Firebase Android.

    (Альтернативный вариант) Добавьте зависимости библиотеки Firebase без использования BoM.

    Если вы не хотите использовать Firebase BoM, вам нужно будет указать версию каждой библиотеки Firebase в строке зависимости.

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

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:25.0.0")
    }
  3. Если вы ещё не подключили приложение к проекту Firebase, сделайте это в консоли Firebase.
  4. Включите анонимную аутентификацию:
    1. В консоли Firebase выберите Безопасность > Аутентификация.
    2. На вкладке Sign-in method (Способ входа) включите поставщика Anonymous (Анонимный).
    3. Необязательно. Если вы обновили проект до Firebase Authentication with Identity Platform, то можете включить автоматическую очистку. Если вы включите этот параметр, анонимные аккаунты, созданные более 30 дней назад, будут автоматически удалены. В проектах с включенной автоматической очисткой анонимная аутентификация больше не будет учитываться в лимитах на использование или квотах на оплату. Подробнее об автоматической очистке…

Анонимная аутентификация с помощью Firebase

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

  1. В методе onCreate своего объекта activity получите общий экземпляр объекта FirebaseAuth:

    Kotlin

    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth

    Java

    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. При инициализации Activity проверьте, вошел ли пользователь в аккаунт:

    Kotlin

    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        updateUI(currentUser)
    }

    Java

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        updateUI(currentUser);
    }
  3. Наконец, вызовите signInAnonymously, чтобы войти в систему как анонимный пользователь:

    Kotlin

    auth.signInAnonymously()
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInAnonymously:success")
                val user = auth.currentUser
                updateUI(user)
            } else {
                // If sign in fails, display a message to the user.
                Log.w(TAG, "signInAnonymously:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }

    Java

    mAuth.signInAnonymously()
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInAnonymously:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInAnonymously:failure", task.getException());
                        Toast.makeText(AnonymousAuthActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });
    Если вход выполнен успешно, вы можете использовать метод getCurrentUser, чтобы получить данные аккаунта пользователя.

Как преобразовать анонимный аккаунт в постоянный

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

  1. Когда пользователь регистрируется, выполните процедуру входа для поставщика аутентификации пользователя, но не вызывайте методы FirebaseAuth.signInWith. Например, получите токен идентификатора Google, токен доступа Facebook или адрес электронной почты и пароль пользователя.
  2. Получите AuthCredential для нового поставщика услуг аутентификации:

    вход с аккаунтом Google

    Kotlin

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)

    Java

    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
    Вход через Facebook

    Kotlin

    val credential = FacebookAuthProvider.getCredential(token.token)

    Java

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    Вход с помощью адреса электронной почты и пароля

    Kotlin

    val credential = EmailAuthProvider.getCredential(email, password)

    Java

    AuthCredential credential = EmailAuthProvider.getCredential(email, password);
  3. Передайте объект AuthCredential в метод linkWithCredential пользователя, выполнившего вход:

    Kotlin

    auth.currentUser!!.linkWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "linkWithCredential:success")
                val user = task.result?.user
                updateUI(user)
            } else {
                Log.w(TAG, "linkWithCredential:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }

    Java

    mAuth.getCurrentUser().linkWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "linkWithCredential:success");
                        FirebaseUser user = task.getResult().getUser();
                        updateUI(user);
                    } else {
                        Log.w(TAG, "linkWithCredential:failure", task.getException());
                        Toast.makeText(AnonymousAuthActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });

Если вызов linkWithCredential выполнен успешно, новый аккаунт пользователя может получить доступ к данным Firebase анонимного аккаунта.

Автоматическая очистка

Если вы перешли на Firebase Authentication with Identity Platform, то можете включить автоматическую очистку в консоли Firebase. Когда вы включите эту функцию, Firebase сможет автоматически удалять анонимные аккаунты, созданные более 30 дней назад. В проектах с включенной автоматической очисткой анонимная аутентификация не будет учитываться в лимитах на использование или квотах на оплату.

  • Любые анонимные аккаунты, созданные после включения автоматической очистки, могут быть автоматически удалены в любое время по истечении 30 дней после создания.
  • Существующие анонимные аккаунты будут автоматически удалены через 30 дней после включения автоматической очистки.
  • Если вы отключите автоматическую очистку, все анонимные аккаунты, запланированные к удалению, останутся в этом статусе.
  • Если вы "обновите" анонимный аккаунт, связав его с любым способом входа, он не будет удален автоматически.

Если вы хотите узнать, сколько пользователей затронет включение этой функции, и вы обновили проект до Firebase Authentication with Identity Platform, вы можете отфильтровать данные по is_anon в Cloud Logging.

Дальнейшие действия

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