Liên kết nhiều nhà cung cấp dịch vụ 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 bạn bằng nhiều trình cung cấp dịch vụ xác thực bằng cách liên kết thông tin xác thực của trình cung cấp dịch vụ xác thực với một tài khoản người dùng hiện có. Người dùng có thể được xác định bằng cùng một mã nhận dạng người dùng Firebase, bất kể trình cung cấp dịch vụ xác thực mà họ đã 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 một Tài khoản Google và đăng nhập bằng một trong hai phương thức này trong tương lai. Hoặc người dùng ẩn danh có thể liên kết một tài khoản Facebook, 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 tính năng hỗ trợ cho hai hoặc nhiều nhà cung cấp dịch vụ 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.

Cách liên kết thông tin xác thực 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ỳ trình cung cấp dịch vụ xác thực hoặc phương thức nào.
  2. Hoàn tất quy trình đăng nhập cho nhà cung cấp xác thực mới, bao gồm cả việc gọi một trong các phương thức FirebaseAuth.signInWith. Ví dụ: lấy mã thông báo nhận dạng trên 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. Lấy AuthCredential cho nhà cung cấp xác thực mới:

    Đăng nhập bằng tài khoản Google

    Kotlin

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)

    Java

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

    Kotlin

    val credential = FacebookAuthProvider.getCredential(token.token)

    Java

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    Đăng nhập bằng email và mật khẩu

    Kotlin

    val credential = EmailAuthProvider.getCredential(email, password)

    Java

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

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

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

    Kotlin

    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 đến linkWithCredential thành công, người dùng hiện có thể đăng nhập bằng bất kỳ trình cung cấp dịch vụ xác thực nào được liên kết và truy cập vào cùng một dữ liệu Firebase.

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

Để huỷ liên kết nhà cung cấp xác thực khỏi tài khoản người dùng, hãy truyền mã nhận dạng nhà cung cấp đến phương thức unlink. Bạn có thể lấy mã nhận dạng nhà cung cấp của các 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

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