Xác thực bằng Apple và Unity

Bạn có thể cho phép người dùng xác thực bằng Firebase bằng Apple ID của họ bằng cách sử dụng Firebase SDK để thực hiện quy trình đăng nhập OAuth 2.0 từ đầu đến cuối.

Trước khi bắt đầu

Để đăng nhập người dùng bằng Apple, trước tiên, hãy định cấu hình tính năng Đăng nhập bằng Apple trên trang web dành cho nhà phát triển của Apple, sau đó bật Apple làm nhà cung cấp dịch vụ đăng nhập cho dự án Firebase của bạn.

Tham gia Chương trình Nhà phát triển của Apple

Chỉ thành viên của Chương trình Nhà phát triển của Apple mới có thể thiết lập tính năng Đăng nhập bằng Apple.

Định cấu hình tính năng Đăng nhập bằng Apple

Bạn phải bật và định cấu hình đúng cách tính năng Đăng nhập bằng Apple trong dự án Firebase của mình. Cấu hình của Nhà phát triển Apple sẽ khác nhau giữa nền tảng Android và Apple. Vui lòng làm theo phần "Định cấu hình tính năng Đăng nhập bằng Apple" trong hướng dẫn iOS+ và/hoặc Android trước khi tiếp tục.

Bật Apple làm nhà cung cấp dịch vụ đăng nhập

  1. Trong bảng điều khiển Firebase, hãy mở mục Auth (Xác thực). Trên thẻ Phương thức đăng nhập, hãy bật trình cung cấp Apple.
  2. Định cấu hình chế độ cài đặt của nhà cung cấp Đăng nhập bằng Apple:
    1. Nếu chỉ triển khai ứng dụng trên các nền tảng của Apple, bạn có thể để trống các trường Mã dịch vụ, Mã Apple Team, khoá riêng tư và mã khoá.
    2. Để được hỗ trợ trên thiết bị Android:
      1. Thêm Firebase vào dự án Android. Nhớ đăng ký chữ ký SHA-1 của ứng dụng khi bạn thiết lập ứng dụng trong bảng điều khiển Firebase.
      2. Trong bảng điều khiển Firebase, hãy mở mục Auth (Xác thực). Trên thẻ Phương thức đăng nhập, hãy bật trình cung cấp Apple. Chỉ định mã nhận dạng dịch vụ mà bạn đã tạo trong phần trước. Ngoài ra, trong phần cấu hình luồng mã OAuth, hãy chỉ định Apple Team ID, khoá riêng tư và mã khoá mà bạn đã tạo trong phần trước.

Tuân thủ các yêu cầu của Apple về dữ liệu ẩn danh

Tính năng Đăng nhập bằng Apple cho phép người dùng ẩn danh hoá dữ liệu của họ, bao gồm cả địa chỉ email, khi đăng nhập. Người dùng chọn lựa chọn này sẽ có địa chỉ email có miền privaterelay.appleid.com. Khi sử dụng tính năng Đăng nhập bằng Apple trong ứng dụng của mình, bạn phải tuân thủ mọi chính sách hoặc điều khoản hiện hành của Apple dành cho nhà phát triển liên quan đến các Apple ID ẩn danh này.

Điều này bao gồm việc lấy mọi sự đồng ý bắt buộc của người dùng trước khi bạn liên kết bất kỳ thông tin nhận dạng cá nhân trực tiếp nào với một Apple ID ẩn danh. Khi sử dụng Xác thực Firebase, điều này có thể bao gồm các thao tác sau:

  • Liên kết địa chỉ email với một ID Apple ẩn danh hoặc ngược lại.
  • Liên kết số điện thoại với một ID Apple ẩn danh hoặc ngược lại
  • Liên kết thông tin đăng nhập mạng xã hội không ẩn danh (Facebook, Google, v.v.) với một Apple ID ẩn danh hoặc ngược lại.

Danh sách bên trên chưa đầy đủ. Hãy tham khảo Thoả thuận cấp phép của Chương trình dành cho nhà phát triển của Apple trong phần Thành viên của tài khoản nhà phát triển để đảm bảo ứng dụng của bạn đáp ứng các yêu cầu của Apple.

Truy cập vào lớp Firebase.Auth.FirebaseAuth

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

Xử lý quy trình đăng nhập bằng Firebase SDK

Quy trình Đăng nhập bằng Apple có sự khác biệt giữa các nền tảng Apple và Android.

Trên các nền tảng của Apple

  1. Cài đặt một trình bổ trợ bên thứ ba để xử lý số chỉ dùng một lần và mã thông báo đăng nhập bằng Apple, chẳng hạn như Gói Lưu trữ tài sản Đăng nhập bằng Apple của Unity. Bạn có thể cần sửa đổi mã để truyền chuỗi số chỉ dùng một lần ngẫu nhiên đã tạo ở trạng thái chuỗi thô để sử dụng trong các thao tác của Firebase (tức là lưu trữ một bản sao của chuỗi đó trước khi tạo biểu mẫu tóm tắt SHA256 của số chỉ dùng một lần).

  2. Sử dụng chuỗi mã thông báo và số chỉ dùng một lần thô thu được để tạo một Firebase Credential và đăng nhập vào Firebase.

    Firebase.Auth.Credential credential =
        Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, null);
    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);
    });

  3. Bạn có thể sử dụng cùng một mẫu với ReauthenticateAsync. Mẫu này có thể dùng để truy xuất thông tin đăng nhập mới cho các thao tác nhạy cảm đòi hỏi phải đăng nhập gần đây. Để biết thêm thông tin, hãy xem phần Quản lý người dùng.

  4. Khi liên kết bằng tính năng Đăng nhập bằng Apple trên các nền tảng của Apple, bạn có thể gặp phải lỗi cho biết một tài khoản Firebase hiện có đã được liên kết với tài khoản Apple. Khi điều này xảy ra, Firebase.Auth.FirebaseAccountLinkException sẽ được gửi thay vì Firebase.FirebaseException tiêu chuẩn. Trong trường hợp này, ngoại lệ bao gồm một thuộc tính UserInfo.UpdatedCredential. Nếu hợp lệ, thuộc tính này có thể được dùng để đăng nhập người dùng được liên kết với Apple thông qua FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync. Thông tin đăng nhập đã cập nhật giúp bạn không cần tạo mã thông báo Đăng nhập bằng Apple mới có số chỉ dùng một lần cho thao tác đăng nhập.

    auth.CurrentUser.LinkWithCredentialAsync(
      Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null))
        .ContinueWithOnMainThread( task => {
          if (task.IsCompletedSuccessfully) {
            // Link Success
          } else {
            if (task.Exception != null) {
              foreach (Exception exception in task.Exception.Flatten().InnerExceptions) {
                Firebase.Auth.FirebaseAccountLinkException firebaseEx =
                  exception as Firebase.Auth.FirebaseAccountLinkException;
                if (firebaseEx != null && firebaseEx.UserInfo.UpdatedCredential.IsValid()) {
                  // Attempt to sign in with the updated credential.
                  auth.SignInAndRetrieveDataWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential).
                    ContinueWithOnMainThread( authResultTask => {
                      // Handle Auth result.
                    });
                } else {
                  Debug.Log("Link with Apple failed:" + firebaseEx );
                }
              } // end for loop
            }
          }
        });

Trên Android

Trên Android, hãy xác thực người dùng bằng Firebase bằng cách tích hợp tính năng Đăng nhập OAuth chung dựa trên web vào ứng dụng của bạn bằng Firebase SDK để thực hiện quy trình đăng nhập từ đầu đến cuối.

Để xử lý quy trình đăng nhập bằng Firebase SDK, hãy làm theo các bước sau:

  1. Tạo một thực thể FederatedOAuthProviderData được định cấu hình bằng mã nhận dạng nhà cung cấp phù hợp với Apple.

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. Không bắt buộc: Chỉ định các phạm vi OAuth 2.0 bổ sung ngoài phạm vi mặc định mà bạn muốn yêu cầu từ trình xác thực.

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("email");
    providerData.Scopes.Add("name");
    
  3. Không bắt buộc: Nếu bạn muốn hiển thị màn hình đăng nhập của Apple bằng một ngôn ngữ khác ngoài tiếng Anh, hãy đặt tham số locale. Hãy xem tài liệu Đăng nhập bằng Apple để biết các ngôn ngữ được hỗ trợ.

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    
  4. Sau khi bạn định cấu hình dữ liệu của nhà cung cấp, hãy sử dụng dữ liệu đó để tạo một FederatedOAuthProvider.

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
      new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. Xác thực bằng Firebase thông qua đối tượng Nhà cung cấp dịch vụ xác thực. Xin lưu ý rằng không giống như các thao tác FirebaseAuth khác, thao tác này sẽ kiểm soát giao diện người dùng của bạn bằng cách bật một khung hiển thị web mà người dùng có thể nhập thông tin đăng nhập của họ.

    Để bắt đầu quy trình đăng nhập, hãy gọi signInWithProvider:

    auth.SignInWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("SignInWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError("SignInWithProviderAsync encountered an error: " +
              task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  6. Bạn có thể sử dụng cùng một mẫu với ReauthenticateWithProvider. Mẫu này có thể dùng để truy xuất thông tin đăng nhập mới cho các thao tác nhạy cảm đòi hỏi phải đăng nhập gần đây.

    user.ReauthenticateWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("ReauthenticateWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError(
            "ReauthenticateWithProviderAsync encountered an error: " +
                task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  7. Ngoài ra, bạn có thể sử dụng LinkWithCredentialAsync() để liên kết các nhà cung cấp dịch vụ danh tính khác nhau với các tài khoản hiện có.

    Xin lưu ý rằng Apple yêu cầu bạn phải nhận được sự đồng ý rõ ràng của người dùng trước khi liên kết tài khoản Apple của họ với dữ liệu khác.

    Ví dụ: để liên kết một tài khoản Facebook với tài khoản Firebase hiện tại, hãy sử dụng mã truy cập mà bạn nhận được khi đăng nhập người dùng vào Facebook:

    // Initialize a Facebook credential with a Facebook access token.
    
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(facebook_token);
    
    // Assuming the current user is an Apple user linking a Facebook provider.
    user.LinkWithCredentialAsync(credential)
        .ContinueWithOnMainThread( 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;
          Firebase.Auth.FirebaseUser user = result.User;
          Debug.LogFormat("User linked successfully: {0} ({1})",
              user.DisplayName, user.UserId);
        });
    

Đăng nhập bằng ứng dụng Ghi chú của Apple

Không giống như các nhà cung cấp khác được Firebase Auth hỗ trợ, Apple không cung cấp URL ảnh.

Ngoài ra, khi người dùng chọn không chia sẻ email của họ với ứng dụng, Apple sẽ cung cấp một địa chỉ email duy nhất cho người dùng đó (theo dạng xyz@privaterelay.appleid.com) và chia sẻ địa chỉ này với ứng dụng của bạn. Nếu bạn đã định cấu hình dịch vụ chuyển tiếp email riêng tư, Apple sẽ chuyển tiếp email được gửi đến địa chỉ ẩn danh đến địa chỉ email thực của người dùng.

Apple chỉ chia sẻ thông tin người dùng (chẳng hạn như tên hiển thị) với các ứng dụng vào lần đầu tiên người dùng đăng nhập. Thông thường, Firebase sẽ lưu trữ tên hiển thị vào lần đầu tiên người dùng đăng nhập bằng Apple. Bạn có thể lấy tên hiển thị này bằng auth.CurrentUser.DisplayName. Tuy nhiên, nếu trước đây bạn dùng Apple để đăng nhập người dùng vào ứng dụng mà không dùng Firebase, thì Apple sẽ không cung cấp tên hiển thị của người dùng cho Firebase.

Các bước tiếp theo

Sau khi người dùng đăng nhập lần đầu tiên, một tài khoản người dùng mới sẽ được tạo và liên kết với thông tin đăng nhập (tức là tên người dùng và mật khẩu, số điện thoại hoặc thông tin nhà cung cấp dịch vụ uỷ quyền) mà người dùng đã đăng nhập. Tài khoản mới này được lưu trữ trong dự án Firebase của bạn và có thể dùng để xác định một người dùng trên mọi ứng dụng trong dự án, bất kể người dùng đăng nhập bằng cách nào.

Trong các ứng dụng của mình, bạn có thể lấy thông tin cơ bản về hồ sơ của người dùng từ đối tượng Firebase.Auth.FirebaseUser. Hãy xem phần Quản lý người dùng.

Trong Cơ sở dữ liệu theo thời gian thực của Firebase và Quy tắc bảo mật của Cloud Storage, bạn có thể lấy mã nhận dạng người dùng duy nhất của người dùng đã đăng nhập từ biến auth và sử dụng mã nhận dạng đó để kiểm soát dữ liệu mà người dùng có thể truy cập.