Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

將多個身份驗證提供程序鏈接到 Android 上的帳戶

通過將身份驗證提供程序憑據鏈接到現有用戶帳戶,您可以允許用戶使用多個身份驗證提供程序登錄您的應用程序。用戶可以通過相同的 Firebase 用戶 ID 進行識別,而不管他們用於登錄的身份驗證提供程序如何。例如,使用密碼登錄的用戶可以關聯 Google 帳戶並在以後使用任一方法登錄。或者,匿名用戶可以關聯 Facebook 帳戶,然後在稍後登錄 Facebook 以繼續使用您的應用。

在你開始之前

向您的應用添加對兩個或多個身份驗證提供程序(可能包括匿名身份驗證)的支持。

要將身份驗證提供程序憑據鏈接到現有用戶帳戶:

  1. 使用任何身份驗證提供程序或方法登錄用戶。
  2. 完成登錄流程為新的身份驗證提供最多,但不包括調用的一個FirebaseAuth.signInWith方法。例如,獲取用戶的 Google ID 令牌、Facebook 訪問令牌或電子郵件和密碼。
  3. 找一個AuthCredential新身份驗證提供:

    谷歌登錄

    爪哇

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

    科特林+KTX

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)
    Facebook登入

    爪哇

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

    科特林+KTX

    val credential = FacebookAuthProvider.getCredential(token.token)
    電子郵件密碼登錄

    爪哇

    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成功,用戶現在可以登錄使用任何鏈接的身份驗證提供並獲得相同的火力地堡數據。

您可以從帳戶中取消身份驗證提供程序的鏈接,以便用戶無法再使用該提供程序登錄。

要取消從用戶帳戶一個auth提供商,通過提供者ID發送到unlink方法。你可以通過調用獲得鏈接到用戶的身份驗證供應商的供應商ID的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
                // ...
            }
        }