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 ID Apple của họ bằng cách sử dụng SDK Firebase để thực hiện luồng đă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 Đă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

Đăng nhập bằng Apple chỉ có thể được cấu hình bởi các thành viên của Chương trình nhà phát triển Apple .

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

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

Cho phép 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ở phần Xác thực . Trên tab Phương thức đăng nhập , kích hoạt nhà cung cấp Apple .
  2. Định cấu hình cài đặt nhà cung cấp Đăng nhập Apple:
    1. Nếu bạn chỉ triển khai ứng dụng của mình trên nền tảng Apple, bạn có thể để trống các trường ID dịch vụ, ID nhóm Apple, khóa riêng và ID khóa.
    2. Để được hỗ trợ trên các thiết bị Android:
      1. Thêm Firebase vào dự án Android của bạn . Hãy nhớ đăng ký chữ ký SHA-1 của ứng dụng khi bạn thiết lập ứng dụng của mình trong bảng điều khiển Firebase.
      2. Trong bảng điều khiển Firebase , hãy mở phần Xác thực . Trên tab Phương thức đăng nhập , kích hoạt nhà cung cấp Apple . Chỉ định ID dịch vụ bạn đã tạo ở phần trước. Ngoài ra, trong phần cấu hình luồng mã OAuth, hãy chỉ định ID nhóm Apple của bạn cũng như khóa riêng và ID khóa bạn đã tạo trong phần trước.

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

Đăng nhập bằng Apple cung cấp cho người dùng tùy chọn ẩn danh dữ liệu của họ, bao gồm cả địa chỉ email, khi đăng nhập. Người dùng chọn tùy chọn này có địa chỉ email có tên miền privaterelay.appleid.com . Khi sử dụ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 dành cho nhà phát triển từ Apple liên quan đến các ID Apple ẩn danh này.

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

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

Danh sách trên không toàn diện. Tham khảo Thỏa thuận cấp phép chương trình dành cho nhà phát triển của Apple trong phần Thành viên trong tài khoản nhà phát triển của bạ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 lớp Firebase.Auth.FirebaseAuth

Lớp FirebaseAuth là cổng cho tất 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;

Xử lý luồng đăng nhập bằng SDK Firebase

Quá trình đăng nhập bằng Apple khác nhau giữa các nền tảng Apple và Android.

Trên nền tảng Apple

  1. Cài đặt plugin của bên thứ ba để xử lý việc tạo mã thông báo và đăng nhập của Apple, chẳng hạn như Đăng nhập bằng gói lưu trữ tài sản Apple của Unity . Bạn có thể cần phải thay đổi mã để sắp xếp chuỗi nonce ngẫu nhiên được tạo ở trạng thái chuỗi thô để sử dụng trong các hoạt động của Firebase (nghĩa là lưu trữ một bản sao của chuỗi đó trước khi tạo dạng thông báo SHA256 của nonce).

  2. Sử dụng chuỗi mã thông báo kết quả và nonce thô để tạo Thông tin xác thực Firebase 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. Mẫu tương tự có thể được sử dụng với ReauthenticateAsync để truy xuất thông tin xác thực mới cho các hoạt động nhạy cảm yêu cầu đăng nhập gần đây. Để biết thêm thông tin, hãy xem Quản lý người dùng .

  4. Khi liên kết với Đăng nhập Apple trên nền tảng Apple, bạn có thể gặp lỗi tài khoản Firebase hiện tại đã đượ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 ném thay vì Firebase.FirebaseException tiêu chuẩn. Trong trường hợp này, ngoại lệ bao gồm thuộc tính UserInfo.UpdatedCredential , nếu hợp lệ, có thể được sử dụng để đăng nhập vào người dùng được liên kết với Apple thông qua FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync . Thông tin xác thực được cập nhật giúp loại bỏ nhu cầu tạo mã thông báo Đăng nhập Apple mới mà không cần dùng đến cho hoạt động đă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, xác thực người dùng của bạn bằng Firebase bằng cách tích hợp Đăng nhập OAuth chung dựa trên web vào ứng dụng của bạn bằng SDK Firebase để thực hiện luồng đăng nhập từ đầu đến cuối.

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

  1. Xây dựng một phiên bản của FederatedOAuthProviderData được định cấu hình với ID nhà cung cấp phù hợp với Apple.

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. Tùy chọn: Chỉ định 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ừ nhà cung cấp xác thực.

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("email");
    providerData.Scopes.Add("name");
    
  3. Tùy chọn: Nếu bạn muốn hiển thị màn hình đăng nhập của Apple bằng ngôn ngữ khác tiếng Anh, hãy đặt tham số locale . 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. Khi dữ liệu nhà cung cấp của bạn đã được định cấu hình, hãy sử dụng dữ liệu đó để tạo 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 với Firebase bằng đối tượng nhà cung cấp xác thực. Lưu ý rằng không giống như các hoạt động 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 lên chế độ xem web trong đó người dùng có thể nhập thông tin xác thực của họ.

    Để bắt đầu luồng đă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. Mẫu tương tự có thể được sử dụng với ReauthenticateWithProvider để truy xuất thông tin xác thực mới cho các hoạt động nhạy cảm yêu cầu đă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. Và bạn có thể sử dụng LinkWithCredentialAsync() để liên kết các nhà cung cấp danh tính khác nhau với các tài khoản hiện có.

    Lưu ý rằng Apple yêu cầu bạn phải nhận được sự đồng ý rõ ràng từ 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 tài khoản Facebook với tài khoản Firebase hiện tại, hãy sử dụng mã thông báo truy cập 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 Apple Notes

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 đó (có dạng xyz@privaterelay.appleid.com ) mà họ chia sẻ 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 các email được gửi đến địa chỉ ẩn danh tới địa chỉ email thực của người dùng.

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

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 xác thực—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ụ xác thực—mà người dùng đã đăng nhập. Tài khoản mới này được lưu trữ như một phần của dự án Firebase của bạn và có thể được sử dụng để xác định người dùng trên mọi ứng dụng trong dự án của bạn, bất kể người dùng đăng nhập bằng cách nào.

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

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