Свяжите несколько поставщиков аутентификации с учетной записью на Android

Вы можете разрешить пользователям входить в ваше приложение с использованием нескольких поставщиков аутентификации, связав учетные данные поставщика аутентификации с существующей учетной записью пользователя. Пользователи идентифицируются по одному и тому же идентификатору пользователя Firebase независимо от поставщика аутентификации, который они использовали для входа. Например, пользователь, вошедший в систему с паролем, может связать учетную запись Google и войти в систему любым из методов в будущем. Или анонимный пользователь может связать учетную запись Facebook, а затем позже войти в систему с помощью Facebook, чтобы продолжить использование вашего приложения.

Прежде чем начать

Добавьте в свое приложение поддержку двух или более поставщиков аутентификации (возможно, включая анонимную аутентификацию).

Чтобы связать учетные данные поставщика аутентификации с существующей учетной записью пользователя:

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

    Вход в Google

    Kotlin+KTX

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)

    Java

    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
    Вход в Facebook

    Kotlin+KTX

    val credential = FacebookAuthProvider.getCredential(token.token)

    Java

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

    Kotlin+KTX

    val credential = EmailAuthProvider.getCredential(email, password)

    Java

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

    Kotlin+KTX

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

    Kotlin+KTX

    val prevUser = auth.currentUser
    auth.signInWithCredential(credential)
        .addOnSuccessListener { result ->
            val currentUser = result.user
            // Merge prevUser and currentUser accounts and data
            // ...
        }
        .addOnFailureListener {
            // ...
        }

    Java

    FirebaseUser prevUser = FirebaseAuth.getInstance().getCurrentUser();
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    FirebaseUser currentUser = task.getResult().getUser();
                    // Merge prevUser and currentUser accounts and data
                    // ...
                }
            });

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

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

Чтобы отменить связь поставщика аутентификации с учетной записью пользователя, передайте идентификатор поставщика методу unlink . Вы можете получить идентификаторы поставщиков аутентификации, связанных с пользователем, вызвав getProviderData .

Kotlin+KTX

Firebase.auth.currentUser!!.unlink(providerId)
    .addOnCompleteListener(this) { task ->
        if (task.isSuccessful) {
            // Auth provider unlinked from account
            // ...
        }
    }

Java

mAuth.getCurrentUser().unlink(providerId)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    // Auth provider unlinked from account
                    // ...
                }
            }
        });