Liên kết nhiều nhà cung cấp xác thực với một tài khoản trên Android

Bạn có thể cho phép người dùng đăng nhập vào ứng dụng của mình bằng nhiều nhà cung cấp xác thực bằng cách liên kết thông tin đăng nhập của nhà cung cấp xác thực với tài khoản người dùng hiện có. Người dùng có thể được nhận dạng bằng cùng một ID người dùng Firebase bất kể nhà cung cấp xác thực mà họ đã sử dụng để đăng nhập. Ví dụ: người dùng đã đăng nhập bằng mật khẩu có thể liên kết tài khoản Google và đăng nhập bằng một trong hai phương thức trong tương lai. Hoặc, người dùng ẩn danh có thể liên kết tài khoản Facebook và sau đó, đăng nhập bằng Facebook để tiếp tục sử dụng ứng dụng của bạn.

Trước khi bắt đầu

Thêm hỗ trợ cho hai hoặc nhiều nhà cung cấp xác thực (có thể bao gồm cả xác thực ẩn danh) vào ứng dụng của bạn.

Để liên kết thông tin đăng nhập của nhà cung cấp xác thực với tài khoản người dùng hiện có:

  1. Đăng nhập người dùng bằng bất kỳ nhà cung cấp hoặc phương thức xác thực nào.
  2. Hoàn thành quy trình đăng nhập cho nhà cung cấp xác thực mới, nhưng không bao gồm, gọi một trong các phương thức FirebaseAuth.signInWith . Ví dụ: lấy mã thông báo ID Google, mã thông báo truy cập Facebook hoặc email và mật khẩu của người dùng.
  3. Nhận AuthCredential cho nhà cung cấp xác thực mới:

    Đăng nhập Google

    Kotlin+KTX

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)

    Java

    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
    Đăng nhập Facebook

    Kotlin+KTX

    val credential = FacebookAuthProvider.getCredential(token.token)

    Java

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    Email-mật khẩu đăng nhập

    Kotlin+KTX

    val credential = EmailAuthProvider.getCredential(email, password)

    Java

    AuthCredential credential = EmailAuthProvider.getCredential(email, password);
  4. Truyền đối tượng AuthCredential cho phương thức linkWithCredential của người dùng đã đăng nhập:

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

    Cuộc gọi đến linkWithCredential sẽ không thành công nếu thông tin đăng nhập đã được liên kết với tài khoản người dùng khác. Trong tình huống này, bạn phải xử lý việc hợp nhất các tài khoản và dữ liệu được liên kết sao cho phù hợp với ứng dụng của mình:

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

Nếu lệnh gọi linkWithCredential thành công, thì giờ đây, người dùng có thể đăng nhập bằng cách sử dụng bất kỳ nhà cung cấp xác thực được liên kết nào và truy cập vào cùng một dữ liệu Firebase.

Bạn có thể hủy liên kết nhà cung cấp xác thực khỏi tài khoản để người dùng không thể đăng nhập bằng nhà cung cấp đó nữa.

Để hủy liên kết nhà cung cấp xác thực khỏi tài khoản người dùng, hãy chuyển ID nhà cung cấp cho phương thức unlink . Bạn có thể lấy ID nhà cung cấp của nhà cung cấp xác thực được liên kết với người dùng bằng cách gọi 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
                    // ...
                }
            }
        });