ตรวจสอบสิทธิ์โดยใช้ Apple และ Unity

คุณสามารถอนุญาตให้ผู้ใช้ตรวจสอบสิทธิ์กับ Firebase โดยใช้ Apple ID ได้โดยดำเนินการดังนี้ โดยใช้ Firebase SDK เพื่อดำเนินการขั้นตอนการลงชื่อเข้าใช้ OAuth 2.0 แบบต้นทางถึงปลายทาง

ก่อนเริ่มต้น

หากต้องการลงชื่อเข้าใช้ให้ผู้ใช้ด้วย Apple ให้กำหนดค่าการลงชื่อเข้าใช้ด้วย Apple ก่อน ในเว็บไซต์ของนักพัฒนาซอฟต์แวร์ Apple จากนั้นให้ Apple เป็นผู้ให้บริการการลงชื่อเข้าใช้สำหรับ โปรเจ็กต์ Firebase

เข้าร่วมโปรแกรมนักพัฒนาซอฟต์แวร์ของ Apple

เฉพาะสมาชิกของนักพัฒนาซอฟต์แวร์ Apple เท่านั้นที่สามารถกำหนดค่าฟีเจอร์ลงชื่อเข้าใช้ด้วย Apple ได้ โปรแกรม

กำหนดค่าการลงชื่อเข้าใช้ด้วย Apple

ต้องเปิดใช้การลงชื่อเข้าใช้ Apple และกำหนดค่าอย่างถูกต้องในโปรเจ็กต์ Firebase การกำหนดค่านักพัฒนาซอฟต์แวร์ของ Apple แตกต่างกันไปตามแพลตฟอร์ม Android และ Apple โปรดทำตาม "กำหนดค่าการลงชื่อเข้าใช้ด้วย Apple" ของ iOS+ และ/หรือ คู่มือ Android ก่อนหน้านี้ ดำเนินการต่อ

เปิดใช้ Apple เป็นผู้ให้บริการการลงชื่อเข้าใช้

  1. ในคอนโซล Firebase ให้เปิดส่วน Auth ในแท็บวิธีการลงชื่อเข้าใช้ เปิดใช้ผู้ให้บริการ Apple
  2. กำหนดการตั้งค่าผู้ให้บริการการลงชื่อเข้าใช้ Apple ดังนี้
    1. หากคุณทำให้แอปใช้งานได้เฉพาะในแพลตฟอร์มของ Apple เท่านั้น ให้ออกจาก ช่องรหัสบริการ, รหัสทีม Apple, คีย์ส่วนตัว และรหัสคีย์ว่างเปล่า
    2. วิธีรับการสนับสนุนในอุปกรณ์ Android
      1. เพิ่ม Firebase ลงในโปรเจ็กต์ Android เป็น อย่าลืมลงทะเบียนลายเซ็น SHA-1 ของแอปเมื่อคุณตั้งค่าแอปใน คอนโซล Firebase
      2. ในคอนโซล Firebase ให้เปิดส่วน Auth ใน แท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการ Apple ระบุ รหัสบริการที่คุณสร้างไว้ในส่วนก่อนหน้า นอกจากนี้ในโค้ด OAuth การกำหนดค่าโฟลว์ ให้ระบุรหัสทีม Apple และคีย์ส่วนตัวของคุณ และรหัสคีย์ที่คุณสร้างไว้ในส่วนก่อนหน้านี้

ปฏิบัติตามข้อกำหนดด้านข้อมูลที่ไม่ระบุตัวบุคคลของ Apple

ฟีเจอร์ลงชื่อเข้าใช้ด้วย Apple ช่วยให้ผู้ใช้เลือกลบข้อมูลระบุตัวบุคคลได้ รวมถึงอีเมลเมื่อลงชื่อเข้าใช้ ผู้ใช้ที่เลือกตัวเลือกนี้ มีที่อยู่อีเมลในโดเมน privaterelay.appleid.com วันและเวลา หากใช้ฟีเจอร์ลงชื่อเข้าใช้ด้วย Apple ในแอป คุณจะต้องปฏิบัติตาม นโยบายหรือข้อกำหนดสำหรับนักพัฒนาซอฟต์แวร์จาก Apple เกี่ยวกับ Apple ที่มีการลบข้อมูลระบุตัวบุคคลเหล่านี้ รหัส

ซึ่งรวมถึงการได้รับความยินยอมที่จำเป็นจากผู้ใช้ก่อนคุณ เชื่อมโยงข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้โดยตรงกับ Apple ที่มีการลบข้อมูลระบุตัวบุคคล ID เมื่อใช้การตรวจสอบสิทธิ์ Firebase อาจรวมถึงสิ่งต่อไปนี้ การดำเนินการ:

  • ลิงก์อีเมลกับ Apple ID ที่ไม่ระบุตัวตนหรือในทางกลับกัน
  • ลิงก์หมายเลขโทรศัพท์กับ Apple ID ที่ไม่ระบุตัวตนหรือในทางกลับกัน
  • ลิงก์ข้อมูลเข้าสู่ระบบโซเชียลที่ระบุตัวบุคคลไม่ได้ (Facebook, Google ฯลฯ) กับ Apple ID ที่ไม่ระบุตัวตนหรือในทางกลับกัน

รายการด้านบนเป็นเพียงตัวอย่างบางส่วนเท่านั้น เข้าร่วมโปรแกรมนักพัฒนาซอฟต์แวร์ของ Apple ข้อตกลงการอนุญาตให้ใช้สิทธิในส่วนการเป็นสมาชิกของบัญชีนักพัฒนาแอป ให้แอปของคุณเป็นไปตามข้อกำหนดของ Apple

เข้าถึงชั้นเรียน Firebase.Auth.FirebaseAuth

คลาส FirebaseAuth เป็นเกตเวย์สำหรับการเรียก API ทั้งหมด ซึ่งเข้าถึงได้ผ่าน FirebaseAuth.DefaultInstance
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

จัดการขั้นตอนการลงชื่อเข้าใช้ด้วย Firebase SDK

ขั้นตอนในการลงชื่อเข้าใช้ด้วย Apple จะแตกต่างกันไปในแพลตฟอร์มของ Apple และ Android ทั้งหมด

ในแพลตฟอร์ม Apple

  1. ติดตั้งปลั๊กอินของบุคคลที่สามเพื่อจัดการ Nonce และโทเค็นการลงชื่อเข้าใช้ Apple เช่น การลงชื่อเข้าใช้ด้วยพื้นที่เก็บข้อมูลของ Apple ของ Unity บรรจุหีบห่อ คุณอาจต้องเปลี่ยนโค้ดเพื่อใช้สตริง Nonce แบบสุ่มที่สร้างขึ้น สถานะสตริงดิบสำหรับใช้ในการดำเนินการ Firebase (ซึ่งก็คือจัดเก็บสำเนาของ ก่อนที่จะสร้างรูปแบบไดเจสต์ SHA256 ของ Nonce)

  2. ใช้สตริงโทเค็นที่ได้และ Nonce ดิบเพื่อสร้าง Firebase ข้อมูลเข้าสู่ระบบและลงชื่อเข้าใช้ 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. รูปแบบเดียวกันนี้สามารถใช้กับ ReauthenticateAsync ซึ่งสามารถ ใช้เพื่อเรียกข้อมูลข้อมูลเข้าสู่ระบบใหม่สำหรับการดำเนินการที่มีความละเอียดอ่อนซึ่งจำเป็นต้องใช้ การเข้าสู่ระบบครั้งล่าสุด สำหรับข้อมูลเพิ่มเติม โปรดดูที่ จัดการผู้ใช้

  4. เมื่อลิงก์กับ Apple Sign-In ในแพลตฟอร์มของ Apple คุณอาจพบข้อผิดพลาด ลิงก์บัญชี Firebase ที่มีอยู่กับบัญชี Apple แล้ว วันและเวลา กรณีนี้จะมีการโยนFirebase.Auth.FirebaseAccountLinkException แทนที่จะเป็น Firebase.FirebaseException มาตรฐาน ในกรณีนี้ ข้อยกเว้นมีพร็อพเพอร์ตี้ UserInfo.UpdatedCredential โดยสามารถใช้เพื่อลงชื่อเข้าใช้ผู้ใช้ที่ลิงก์กับ Apple ผ่าน หากเหมาะสม FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync ข้อมูลเข้าสู่ระบบที่อัปเดตนี้ทำให้ไม่จำเป็นต้องสร้างโทเค็น Apple Sign-In ใหม่ ด้วยค่า Nonce สำหรับการดำเนินการลงชื่อเข้าใช้

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

บน Android

ใน Android ตรวจสอบสิทธิ์ผู้ใช้ด้วย Firebase ด้วยการผสานรวมในเว็บ การเข้าสู่ระบบ OAuth ทั่วไปในแอปโดยใช้ Firebase SDK เพื่อดำเนินการ สิ้นสุดขั้นตอนการลงชื่อเข้าใช้

หากต้องการจัดการขั้นตอนการลงชื่อเข้าใช้ด้วย Firebase SDK ให้ทำตามขั้นตอนต่อไปนี้

  1. สร้างอินสแตนซ์ของ FederatedOAuthProviderData ที่กำหนดค่าด้วย รหัสผู้ให้บริการที่เหมาะกับ Apple เท่านั้น

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. ไม่บังคับ: ระบุขอบเขต OAuth 2.0 เพิ่มเติมนอกเหนือจากค่าเริ่มต้นที่ ต้องการส่งคำขอจากผู้ให้บริการตรวจสอบสิทธิ์

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("email");
    providerData.Scopes.Add("name");
    
  3. ไม่บังคับ: หากต้องการแสดงหน้าจอลงชื่อเข้าใช้ของ Apple ในภาษา นอกเหนือจากภาษาอังกฤษ ให้ตั้งค่าพารามิเตอร์ locale โปรดดู ลงชื่อเข้าใช้ด้วยเอกสารของ Apple สำหรับภาษาที่รองรับ

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    
  4. เมื่อกำหนดค่าข้อมูลผู้ให้บริการแล้ว ให้ใช้ข้อมูลเพื่อสร้าง FederatedOAuthProvider

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
      new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. ตรวจสอบสิทธิ์กับ Firebase โดยใช้ออบเจ็กต์ผู้ให้บริการการตรวจสอบสิทธิ์ โปรดทราบว่าสิ่งที่ การดำเนินการ FirebaseAuth อื่นๆ ขั้นตอนนี้จะควบคุม UI ของคุณด้วยการ เป็นมุมมองเว็บที่ผู้ใช้สามารถป้อนข้อมูลเข้าสู่ระบบได้

    หากต้องการเริ่มขั้นตอนการลงชื่อเข้าใช้ โปรดโทรหา 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. รูปแบบเดียวกันนี้สามารถใช้กับ ReauthenticateWithProvider ซึ่งสามารถ ใช้เพื่อเรียกข้อมูลข้อมูลเข้าสู่ระบบใหม่สำหรับการดำเนินการที่มีความละเอียดอ่อนซึ่งจำเป็นต้องใช้ การเข้าสู่ระบบครั้งล่าสุด

    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. และคุณจะใช้ LinkWithCredentialAsync() เพื่อลิงก์ผู้ให้บริการข้อมูลประจำตัวรายต่างๆ ได้ กับบัญชีที่มีอยู่แล้ว

    โปรดทราบว่า Apple กำหนดให้คุณต้องขอความยินยอมอย่างชัดแจ้งจากผู้ใช้ก่อนดำเนินการ ลิงก์บัญชี Apple กับข้อมูลอื่น

    เช่น หากต้องการลิงก์บัญชี Facebook กับบัญชี Firebase ปัจจุบัน ให้ใช้ โทเค็นเพื่อการเข้าถึงที่คุณได้รับจากการลงชื่อเข้าใช้ 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);
        });
    

ลงชื่อเข้าใช้ด้วย Apple Notes

Apple ไม่เหมือนกับผู้ให้บริการรายอื่นๆ ที่ Firebase Auth รองรับ URL ของภาพถ่าย

นอกจากนี้ เมื่อผู้ใช้เลือกที่จะไม่แชร์อีเมลกับแอป Apple ให้ที่อยู่อีเมลที่ไม่ซ้ำกันสำหรับผู้ใช้ดังกล่าว (ในแบบฟอร์ม xyz@privaterelay.appleid.com) ซึ่งแชร์กับแอปของคุณ หากคุณ กำหนดค่าบริการส่งต่ออีเมลส่วนตัวแล้ว Apple จะส่งต่ออีเมลที่ส่งไปยัง กับอีเมลจริงของผู้ใช้

Apple จะแชร์เฉพาะข้อมูลผู้ใช้ เช่น ชื่อที่แสดงกับแอป ครั้งแรกที่ผู้ใช้ลงชื่อเข้าใช้ โดยทั่วไป Firebase จะจัดเก็บชื่อที่แสดง ครั้งแรกที่ผู้ใช้ลงชื่อเข้าใช้ด้วย Apple ซึ่งคุณจะใช้ auth.CurrentUser.DisplayName อย่างไรก็ตาม หากก่อนหน้านี้คุณใช้ Apple ในการลงชื่อเข้าใช้แอป เมื่อใช้ Firebase Apple จะไม่มอบชื่อที่แสดงของผู้ใช้ให้ Firebase

ขั้นตอนถัดไป

หลังจากผู้ใช้ลงชื่อเข้าใช้เป็นครั้งแรก ระบบจะสร้างบัญชีผู้ใช้ใหม่และลิงก์กับข้อมูลเข้าสู่ระบบ ซึ่งก็คือชื่อผู้ใช้และรหัสผ่าน หมายเลขโทรศัพท์ หรือข้อมูลของผู้ให้บริการการตรวจสอบสิทธิ์ ซึ่งผู้ใช้ที่ลงชื่อเข้าใช้ด้วย ระบบจะจัดเก็บบัญชีใหม่นี้เป็นส่วนหนึ่งของโปรเจ็กต์ Firebase และสามารถใช้เพื่อระบุผู้ใช้ในทุกแอปในโปรเจ็กต์ของคุณได้ ไม่ว่าผู้ใช้จะลงชื่อเข้าใช้ด้วยวิธีใด

ในแอป คุณสามารถดูข้อมูลโปรไฟล์พื้นฐานของผู้ใช้ได้จากออบเจ็กต์ Firebase.Auth.FirebaseUser โปรดดูหัวข้อจัดการผู้ใช้

ในกฎการรักษาความปลอดภัยของ Firebase และ Cloud Storage ในฐานข้อมูลเรียลไทม์ของ Firebase คุณจะได้รับรหัสผู้ใช้ที่ไม่ซ้ำของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปรการตรวจสอบสิทธิ์ และใช้รหัสดังกล่าวเพื่อควบคุมข้อมูลที่ผู้ใช้เข้าถึงได้