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

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

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

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

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

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

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

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

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

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

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

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

ซึ่งรวมถึงการขอความยินยอมจากผู้ใช้ที่จำเป็นก่อนที่คุณจะ เชื่อมโยงข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้โดยตรงกับ 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 เช่น Unity's Sign In With Apple Asset Storage Package คุณอาจต้องแก้ไขโค้ดเพื่อส่งต่อสตริง Nonce แบบสุ่มที่สร้างขึ้นใน สถานะสตริงดิบเพื่อใช้ในการดำเนินการของ Firebase (กล่าวคือ จัดเก็บสำเนาของ สตริงดังกล่าวไว้ก่อนที่จะสร้างรูปแบบ SHA256 Digest ของ Nonce)

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

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

    หากต้องการเริ่มขั้นตอนการลงชื่อเข้าใช้ ให้เรียกใช้ 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

Apple ไม่ได้ให้ URL รูปภาพ ซึ่งต่างจากผู้ให้บริการรายอื่นๆ ที่ Firebase Auth รองรับ

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

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

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

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

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

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