Check out what’s new from Firebase at Google I/O 2022. Learn more

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

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 dịch vụ xác thực bằng cách liên kết thông tin xác thực của nhà cung cấp dịch vụ 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 dịch vụ 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, một 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 xác thực ẩn danh) vào ứng dụng của bạn.

Lớp FirebaseAuth là cổng cho tất cả các lệnh gọi API. Nó có thể truy cập được thông qua FirebaseAuth.DefaultInstance .
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

Để liên kết thông tin xác thực của nhà cung cấp dịch vụ 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 pháp 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 Firebase.Auth.FirebaseAuth.SignInWithCredentialAsync . 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 thông tin xác thực Firebase.Auth.Credential cho nhà cung cấp xác thực mới:

    Đăng nhập Google
    Firebase.Auth.Credential credential =
        Firebase.Auth.GoogleAuthProvider.GetCredential(googleIdToken, googleAccessToken);
    
    Đăng nhập Facebook
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(accessToken);
    
    Email-mật khẩu đăng nhập
    Firebase.Auth.Credential credential =
        Firebase.Auth.EmailAuthProvider.GetCredential(email, password);
    
  4. Chuyển đối tượng Firebase.Auth.Credential vào phương thức LinkWithCredentialAsync của người dùng đã đăng nhập:

    auth.CurrentUser.LinkWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("LinkWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("LinkWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.FirebaseUser newUser = task.Result;
      Debug.LogFormat("Credentials successfully linked to Firebase user: {0} ({1})",
          newUser.DisplayName, newUser.UserId);
    });
    

    Lệnh gọi tới LinkWithCredentialAsync sẽ không thành công nếu thông tin đăng nhập đã đượ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 được liên kết sao cho phù hợp với ứng dụng của mình:

    // Gather data for the currently signed in User.
    string currentUserId = auth.CurrentUser.UserId;
    string currentEmail = auth.CurrentUser.Email;
    string currentDisplayName = auth.CurrentUser.DisplayName;
    System.Uri currentPhotoUrl = auth.CurrentUser.PhotoUrl;
    
    // Sign in with the new credentials.
    auth.SignInWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.FirebaseUser newUser = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          newUser.DisplayName, newUser.UserId);
    
      // TODO: Merge app specific details using the newUser and values from the
      // previous user, saved above.
    });
    

Nếu lệnh gọi tới LinkWithCredentialAsync thành công, người dùng hiện có thể đăng nhập bằ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 tới phương thức UnlinkAsync . Bạn có thể lấy ID 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 ProviderData .

// Unlink the sign-in provider from the currently active user.
// providerIdString is a string identifying a provider,
// retrieved via FirebaseAuth.FetchProvidersForEmail().
auth.CurrentUser.UnlinkAsync(providerIdString).ContinueWith(task => {
  if (task.IsCanceled) {
    Debug.LogError("UnlinkAsync was canceled.");
    return;
  }
  if (task.IsFaulted) {
    Debug.LogError("UnlinkAsync encountered an error: " + task.Exception);
    return;
  }

  // The user has been unlinked from the provider.
  Firebase.Auth.FirebaseUser newUser = task.Result;
  Debug.LogFormat("Credentials successfully unlinked from user: {0} ({1})",
      newUser.DisplayName, newUser.UserId);
});