Google is committed to advancing racial equity for Black communities. See how.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

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

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

Прежде чем вы начнете

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

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

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

    Вход в Google

    Ява

    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);

    Котлин + KTX

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)
    Логин в фейсбук

    Ява

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());

    Котлин + KTX

    val credential = FacebookAuthProvider.getCredential(token.token)
    Email-пароль для входа

    Ява

    AuthCredential credential = EmailAuthProvider.getCredential(email, password);

    Котлин + KTX

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

    Ява

    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);
                    }
    
                    // ...
                }
            });

    Котлин + 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)
                }
    
                // ...
            }

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

    Ява

    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
                    // ...
                }
            });

    Котлин + KTX

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

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

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

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

Ява

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
                    // ...
                }
            }
        });

Котлин + KTX

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