Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

Bạn có thể cho phép người dùng của mình xác thực với Firebase bằng ID Apple của họ bằng cách sử dụng SDK Firebase để thực hiện quy trình đăng nhập OAuth 2.0 end-to-end.

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 với Apple trên trang web dành cho nhà phát triển của Apple, sau đó cho phép 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 Apple

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

Định cấu hình Đăng nhập với 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 Nhà phát triển của Apple khác nhau trên các nền tảng Android và iOS. Hãy làm theo các "Configure Đăng nhập Với Apple" của iOS và / hoặc Android hướng dẫn 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 căn cứ hỏa lực console , hãy mở phần Auth. Trên Đăng nhập tab phương pháp, cho phép các nhà cung cấp của Apple.
  2. Định cấu hình cài đặt nhà cung cấp Đăng nhập Apple:
    1. Nếu chỉ triển khai ứng dụng của mình trên iOS, bạn có thể để trống các trường ID dịch vụ, ID nhóm Apple, khóa cá nhân và ID khóa.
    2. Để được hỗ trợ trên các thiết bị Android:
      1. Thêm căn cứ hỏa lực cho dự án Android của bạn . Đảm bảo đă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 căn cứ hỏa lực console , hãy mở phần Auth. Trên Đăng nhập tab phương pháp, cho phép các nhà cung cấp của Apple. Chỉ định ID dịch vụ 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 ID nhóm Apple của bạn và khóa cá nhân và ID khóa mà 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 với Apple cung cấp cho người dùng tùy chọn của nặc danh hóa dữ liệu của họ, bao gồm địa chỉ email của họ, khi đăng nhập. Người dùng chọn tùy chọn này có địa chỉ email với các tên miền privaterelay.appleid.com . Khi bạn 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 về các ID Apple ẩn danh này.

Điều này bao gồm việc nhận đượ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 đăng nhập 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 nhà phát triển của Apple trong phần Tư cách thành viên của 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 Firebase.Auth.FirebaseAuth lớp

Các FirebaseAuth lớp là cửa ngõ cho tất cả các cuộc gọi API. Đó là thể truy cập thông qua FirebaseAuth.DefaultInstance .
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

Xử lý quy trình đăng nhập với SDK Firebase

Quy trình Đăng nhập bằng Apple khác nhau trên các nền tảng iOS và Android.

Trên iOS

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

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

  3. Các mô hình tương tự có thể được sử dụng với ReauthenticateAsync mà có thể được sử dụng để lấy thông tin tươi cho các hoạt động nhạy cảm đòi hỏi phải đăng nhập gần đây. Để biết thêm thông tin, xem Quản lý người dùng .

  4. Khi liên kết với Đăng nhập Apple trên iOS, bạn có thể gặp phải 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 một Firebase.Auth.FirebaseAccountLinkException sẽ được ném thay vì tiêu chuẩn Firebase.FirebsaeException . Trường hợp ngoại lệ bao gồm một UserInfo.UpdatedCredential tài sản đó, nếu hợp lệ, có thể được sử dụng để đăng nhập người dùng Apple liên kết thông qua FirebaseAuth.SignInWithCredential . Thông tin xác thực được cập nhật tránh được nhu cầu tạo mã thông báo Đăng nhập Apple mới mà không cần đến thao tác đăng nhập.

    Lưu ý rằng LinkWithCredentialAsync sẽ tiếp tục ném các tiêu chuẩn Firebase.FirebaseException về những thất bại liên kết, và do đó không có khả năng trả lại một chứng chỉ được cập nhật.

    auth.CurrentUser.LinkAndRetrieveDataWithCredentialAsync(
      Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null))
        .ContinueWithOnMainThread( task => {
          if (task.IsCompleted) {
            // 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.SignInWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential).
                    ContinueWithOnMainThread( signInTask => {
                      // Handle Sign in result.
                    });
                } else {
                  DebugLog("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 với 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 cách sử dụng SDK Firebase để thực hiện quy trình đăng nhập từ đầu đến cuối.

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

  1. Xây dựng một thể hiện của một FederatedOAuthProviderData cấu hình với các nhà cung cấp thích hợp ID cho Apple.

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. Tùy chọn: Xác định thêm OAuth 2.0 phạm vi vượt ra ngoài mặc định mà bạn muốn yêu cầu từ nhà cung cấp chứng 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ị của Apple màn hình đăng nhập bằng một ngôn ngữ khác ngoài tiếng Anh, thiết lập locale tham số. Xem Đăng nhập với tài liệu của Apple cho miền địa phươ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 nó để 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 Auth. 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 một chế độ xem web trong đó người dùng có thể nhập thông tin đăng nhập của họ.

    Để bắt đầu đăng nhập dòng chả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.SignInResult signInResult = task.Result;
        Firebase.Auth.FirebaseUser user = signInResult.User;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  6. Các mô hình tương tự có thể được sử dụng với ReauthenticateWithProvider mà có thể được sử dụng để lấy thông tin tươi cho các hoạt động 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.SignInResult signInResult = task.Result;
        Firebase.Auth.FirebaseUser user = signInResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  7. Và, bạn có thể sử dụng linkWithCredential() để liên kết các nhà cung cấp danh tính khác nhau vào các tài khoản hiện có.

    Lưu ý rằng Apple yêu cầu bạn phải có sự đồng ý rõ ràng từ người dùng trước khi bạn 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.LinkAndRetrieveDataWithCredentialAsync(credential)
        .ContinueWithOnMainThread( task => {
          if (task.IsCanceled) {
              Debug.LogError("LinkAndRetrieveDataWithCredentialAsync was canceled.");
              return;
          }
          if (task.IsFaulted) {
            Debug.LogError("LinkAndRetrieveDataWithCredentialAsync encountered an error: "
                           + task.Exception);
              return;
          }
    
          Firebase.Auth.SignInResult signInResult = task.Result;
          Firebase.Auth.FirebaseUser user = signInResult.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 các ứng dụng, các quy định của Apple một địa chỉ email duy nhất cho người dùng đó (có dạng xyz@privaterelay.appleid.com ), mà nó 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 đến địa chỉ email thực của người dùng.

Táo thông tin chỉ chia sẻ người dùng như tên hiển thị với các ứng dụng lần đầu tiên một người dùng đăng nhập. Thông thường, căn cứ hỏa lực các cửa hàng tên hiển thị lần đầu tiên một người dùng đăng nhập với Apple, mà bạn có thể nhận được với getCurrentUser().getDisplayName() . 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, 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 — nghĩa 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 xác thực — người dùng đã đăng nhập bằng. 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 :: user. Xem Quản lý người dùng .

Trong Cơ sở dữ liệu thời gian thực Firebase và Quy tắc bảo mật lưu trữ đám mây, 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 auth và sử dụng nó để kiểm soát dữ liệu mà người dùng có thể truy cập.