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 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 thông qua nhiều nhà cung cấp dịch vụ xác thực bằng cách liên kết thông tin đăng nhập 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 nhận dạng bằng cùng một mã nhận dạng người dùng Firebase, bất kể họ đã sử dụng nhà cung cấp dịch vụ xác thực nào để đă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 rồi 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 2 hoặc nhiều nhà cung cấp dịch vụ xác thực (có thể bao gồm cả phương thức xác thực ẩn danh) vào ứng dụng của bạn.

Lớp FirebaseAuth là cổng vào cho tất cả lệnh gọi API. Bạn có thể truy cập tệp này thông qua FirebaseAuth.DefaultInstance.
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

Cách liên kết thông tin đăng nhập của 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ó:

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

    Đăng nhập bằng Google
    Firebase.Auth.Credential credential =
        Firebase.Auth.GoogleAuthProvider.GetCredential(googleIdToken, googleAccessToken);
    
    Đăng nhập Facebook
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(accessToken);
    
    Đăng nhập bằng email bằng mật khẩu
    Firebase.Auth.Credential credential =
        Firebase.Auth.EmailAuthProvider.GetCredential(email, password);
    
  4. Truyền đối tượng Firebase.Auth.Credential đến 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.AuthResult result = task.Result;
      Debug.LogFormat("Credentials successfully linked to Firebase user: {0} ({1})",
          result.User.DisplayName, result.User.UserId);
    });
    

    Lệnh gọi đến 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 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.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.AuthResult result = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          result.User.DisplayName, result.User.UserId);
    
      // TODO: Merge app specific details using the newUser and values from the
      // previous user, saved above.
    });
    

Nếu lệnh gọi đến LinkWithCredentialAsync thành công, thì giờ đây, người dùng có thể đăng nhập bằng bất kỳ nhà cung cấp dịch vụ xác thực nào đã 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 dịch vụ xác thực khỏi một tài khoản để người dùng không thể đăng nhập bằng tài khoản nhà cung cấp đó nữa.

Để huỷ liên kết trình cung cấp dịch vụ xác thực khỏi tài khoản người dùng, hãy chuyển mã nhà cung cấp vào phương thức UnlinkAsync. Bạn có thể lấy mã nhà cung cấp của các nhà cung cấp dịch vụ 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.AuthResult result = task.Result;
  Debug.LogFormat("Credentials successfully unlinked from user: {0} ({1})",
      result.User.DisplayName, result.User.UserId);
});