คุณอนุญาตให้ผู้ใช้ตรวจสอบสิทธิ์กับ Firebase โดยใช้ Apple ID ได้โดย ใช้ Firebase SDK เพื่อดำเนินการขั้นตอนการลงชื่อเข้าใช้ OAuth 2.0 แบบครบวงจร
ก่อนเริ่มต้น
หากต้องการให้ผู้ใช้ลงชื่อเข้าใช้โดยใช้ Apple ก่อนอื่นให้กำหนดค่าการลงชื่อเข้าใช้ด้วย Apple ในเว็บไซต์นักพัฒนาแอปของ Apple จากนั้นเปิดใช้ Apple เป็นผู้ให้บริการลงชื่อเข้าใช้สำหรับโปรเจ็กต์ Firebase
เข้าร่วม Apple Developer Program
สมาชิกโปรแกรมนักพัฒนาซอฟต์แวร์ของ Apple เท่านั้นที่กำหนดค่าการลงชื่อเข้าใช้ด้วย Apple ได้
กำหนดค่าการลงชื่อเข้าใช้ด้วย Apple
คุณต้องเปิดใช้และกำหนดค่าการลงชื่อเข้าใช้ด้วย Apple อย่างถูกต้องในโปรเจ็กต์ Firebase การกำหนดค่า Apple Developer จะแตกต่างกันไปในแพลตฟอร์ม Android และ Apple โปรดทำตามส่วน "กำหนดค่าการลงชื่อเข้าใช้ด้วย Apple" ในคู่มือ iOS+ และ/หรือ Android ก่อนดำเนินการต่อเปิดใช้ Apple เป็นผู้ให้บริการลงชื่อเข้าใช้
- ในFirebase คอนโซล ให้ไปที่ ความปลอดภัย > การตรวจสอบสิทธิ์
- ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการลงชื่อเข้าใช้ Apple
- กำหนดการตั้งค่าผู้ให้บริการลงชื่อเข้าใช้ด้วย Apple ดังนี้
- Apple: หากคุณกําลังติดตั้งใช้งานแอปบนแพลตฟอร์มของ Apple เท่านั้น คุณสามารถปล่อยให้ช่องรหัสบริการ รหัสทีม Apple คีย์ส่วนตัว และรหัสคีย์ว่างไว้ได้
-
Android: ทำตามขั้นตอนต่อไปนี้เพื่อรองรับ
อุปกรณ์ Android
- เพิ่ม Firebase ในโปรเจ็กต์ Android
-
ระบุลายนิ้วมือ SHA-1 ของแอปหากยังไม่ได้ทำ
-
ในFirebaseคอนโซล ให้ไปที่
การตั้งค่า > แท็บทั่วไป - เลื่อนลงไปที่การ์ดแอปของคุณ เลือกแอป Android แล้วเพิ่มลายนิ้วมือ SHA-1 ในช่องลายนิ้วมือของใบรับรอง SHA
ดูรายละเอียดวิธีรับลายนิ้วมือ SHA ของแอปได้ที่ การตรวจสอบสิทธิ์ไคลเอ็นต์
-
ในFirebaseคอนโซล ให้ไปที่
-
กำหนดการตั้งค่าผู้ให้บริการลงชื่อเข้าใช้ด้วย Apple ดังนี้
- ในFirebaseคอนโซล ให้ไปที่ความปลอดภัย > การตรวจสอบสิทธิ์
- ในแท็บวิธีการลงชื่อเข้าใช้ ให้คลิกผู้ให้บริการลงชื่อเข้าใช้ด้วย Apple
- ระบุรหัสบริการที่คุณสร้างไว้ในส่วนก่อนหน้า นอกจากนี้ ในส่วนการกำหนดค่าโฟลว์ของรหัส OAuth ให้ระบุ รหัสทีม Apple รวมถึงคีย์ส่วนตัวและรหัสคีย์ที่คุณสร้างไว้ใน ส่วนก่อนหน้า
ปฏิบัติตามข้อกำหนดด้านข้อมูลที่ไม่ระบุตัวบุคคลของ Apple
การลงชื่อเข้าใช้ด้วย Apple ช่วยให้ผู้ใช้มีตัวเลือกในการปกปิดข้อมูล รวมถึงอีเมลเมื่อลงชื่อเข้าใช้ ผู้ใช้ที่เลือกตัวเลือกนี้
จะมีอีเมลที่มีโดเมน privaterelay.appleid.com เมื่อใช้ระบบลงชื่อเข้าใช้ด้วย Apple ในแอป คุณต้องปฏิบัติตามนโยบายหรือข้อกำหนดสำหรับนักพัฒนาแอปที่เกี่ยวข้องจาก Apple เกี่ยวกับ Apple ID ที่ไม่ระบุตัวตนเหล่านี้
ซึ่งรวมถึงการขอรับความยินยอมของผู้ใช้ที่จำเป็นก่อนที่คุณจะเชื่อมโยงข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้โดยตรงกับ Apple ID ที่ไม่ระบุตัวตน เมื่อใช้การตรวจสอบสิทธิ์ Firebase การดำเนินการต่อไปนี้อาจรวมอยู่ด้วย
- ลิงก์ที่อยู่อีเมลกับ Apple ID ที่มีการปกปิดข้อมูลระบุตัวบุคคล หรือในทางกลับกัน
- ลิงก์หมายเลขโทรศัพท์กับ Apple ID ที่ไม่ระบุตัวตนหรือในทางกลับกัน
- ลิงก์ข้อมูลเข้าสู่ระบบโซเชียลที่ไม่ระบุตัวตน (Facebook, Google ฯลฯ) กับ Apple ID ที่ไม่ระบุตัวตน หรือในทางกลับกัน
รายการด้านบนเป็นเพียงตัวอย่างบางส่วนเท่านั้น โปรดดูข้อตกลงการอนุญาตให้ใช้สิทธิของโปรแกรม Developer Program ของ Apple ในส่วนการเป็นสมาชิกของบัญชีนักพัฒนาแอปเพื่อให้แน่ใจว่าแอปเป็นไปตามข้อกำหนดของ Apple
เข้าถึงชั้นเรียน Firebase.Auth.FirebaseAuth
FirebaseAuth คลาสเป็นเกตเวย์สำหรับการเรียก API ทั้งหมด
โดยเข้าถึงได้ผ่าน FirebaseAuth.DefaultInstance
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;
จัดการขั้นตอนการลงชื่อเข้าใช้ด้วย Firebase SDK
กระบวนการลงชื่อเข้าใช้ด้วย Apple จะแตกต่างกันไปในแพลตฟอร์ม Apple และ Android
ในแพลตฟอร์มของ Apple
ติดตั้งปลั๊กอินของบุคคลที่สามเพื่อจัดการ Nonce และโทเค็นการลงชื่อเข้าใช้ด้วย Apple เช่น Unity's Sign In With Apple Asset Storage Package คุณอาจต้องแก้ไขโค้ดเพื่อส่งต่อสตริง Nonce แบบสุ่มที่สร้างขึ้นในสถานะสตริงดิบเพื่อใช้ในการดำเนินการของ Firebase (กล่าวคือ จัดเก็บสำเนาของสตริงดังกล่าวไว้ก่อนที่จะสร้างรูปแบบ SHA256 ไดเจสต์ของ Nonce)
ใช้สตริงโทเค็นและ 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); });
คุณสามารถใช้รูปแบบเดียวกันกับ
ReauthenticateAsyncซึ่งใช้เพื่อดึงข้อมูลเข้าสู่ระบบใหม่สำหรับการดำเนินการที่ละเอียดอ่อนซึ่งต้องมีการเข้าสู่ระบบล่าสุดได้ ดูข้อมูลเพิ่มเติมได้ที่หัวข้อจัดการผู้ใช้เมื่อลิงก์กับระบบลงชื่อเข้าใช้ด้วย Apple ในแพลตฟอร์มของ Apple คุณอาจพบข้อผิดพลาดที่ระบุว่ามีการลิงก์บัญชี Firebase ที่มีอยู่กับบัญชี Apple ไปแล้ว เมื่อเกิดเหตุการณ์นี้ ระบบจะแสดง
Firebase.Auth.FirebaseAccountLinkExceptionแทนFirebase.FirebaseExceptionมาตรฐาน ในกรณีนี้ ข้อยกเว้นจะรวมถึงพร็อพเพอร์ตี้UserInfo.UpdatedCredentialซึ่งหากถูกต้อง อาจใช้เพื่อลงชื่อเข้าใช้ผู้ใช้ที่ลิงก์กับ Apple ผ่านFirebaseAuth.SignInAndRetrieveDataWithCredentialAsyncได้ ข้อมูลเข้าสู่ระบบที่อัปเดตแล้วจะช่วยให้ไม่ต้องสร้างโทเค็นการลงชื่อเข้าใช้ด้วย Apple ใหม่พร้อม 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 ให้ทำตามขั้นตอนต่อไปนี้
สร้างอินสแตนซ์ของ
FederatedOAuthProviderDataที่กำหนดค่าด้วย รหัสผู้ให้บริการที่เหมาะสมสำหรับ AppleFirebase.Auth.FederatedOAuthProviderData providerData = new Firebase.Auth.FederatedOAuthProviderData(); providerData.ProviderId = "apple.com";ไม่บังคับ: ระบุขอบเขต OAuth 2.0 เพิ่มเติมจากค่าเริ่มต้นที่คุณต้องการขอจากผู้ให้บริการตรวจสอบสิทธิ์
providerData.Scopes = new List<string>(); providerData.Scopes.Add("email"); providerData.Scopes.Add("name");ไม่บังคับ: หากต้องการแสดงหน้าจอลงชื่อเข้าใช้ของ Apple ในภาษาอื่นที่ไม่ใช่ภาษาอังกฤษ ให้ตั้งค่าพารามิเตอร์
localeดูภาษาที่รองรับได้ใน เอกสารประกอบการลงชื่อเข้าใช้ด้วย AppleproviderData.CustomParameters = new Dictionary<string,string>; // Localize to French. providerData.CustomParameters.Add("language", "fr");เมื่อกำหนดค่าข้อมูลผู้ให้บริการแล้ว ให้ใช้ข้อมูลดังกล่าวเพื่อสร้าง FederatedOAuthProvider
// Construct a FederatedOAuthProvider for use in Auth methods. Firebase.Auth.FederatedOAuthProvider provider = new Firebase.Auth.FederatedOAuthProvider(); provider.SetProviderData(providerData);ตรวจสอบสิทธิ์ด้วย Firebase โดยใช้ออบเจ็กต์ผู้ให้บริการการตรวจสอบสิทธิ์ โปรดทราบว่าการดำเนินการนี้จะควบคุม UI โดยการแสดงมุมมองเว็บที่ผู้ใช้สามารถป้อนข้อมูลเข้าสู่ระบบ ซึ่งแตกต่างจากการดำเนินการอื่นๆ ของ FirebaseAuth
หากต้องการเริ่มขั้นตอนการลงชื่อเข้าใช้ ให้เรียกใช้
signInWithProviderauth.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); });คุณสามารถใช้รูปแบบเดียวกันกับ
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); });และคุณสามารถใช้
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 ไม่ได้ให้ URL รูปภาพ ซึ่งต่างจากผู้ให้บริการรายอื่นๆ ที่ Firebase Auth รองรับ
นอกจากนี้ เมื่อผู้ใช้เลือกที่จะไม่แชร์อีเมลกับแอป Apple จะจัดสรรอีเมลที่ไม่ซ้ำกันสำหรับผู้ใช้รายนั้น (ในรูปแบบ
xyz@privaterelay.appleid.com) ซึ่งจะแชร์กับแอปของคุณ หากคุณ
กำหนดค่าบริการรีเลย์อีเมลส่วนตัว Apple จะส่งต่ออีเมลที่ส่งไปยัง
อีเมลที่ปกปิดข้อมูลส่วนตัวไปยังอีเมลจริงของผู้ใช้
Apple จะแชร์ข้อมูลผู้ใช้ เช่น ชื่อที่แสดง กับแอปเฉพาะใน
ครั้งแรกที่ผู้ใช้ลงชื่อเข้าใช้ โดยปกติแล้ว Firebase จะจัดเก็บชื่อที่แสดงเมื่อผู้ใช้ลงชื่อเข้าใช้ด้วย Apple เป็นครั้งแรก ซึ่งคุณจะรับได้ด้วย
auth.CurrentUser.DisplayName
อย่างไรก็ตาม หากก่อนหน้านี้คุณใช้ Apple เพื่อให้ผู้ใช้ลงชื่อเข้าใช้แอปโดยไม่ใช้ Firebase ทาง Apple จะไม่ระบุชื่อที่แสดงของผู้ใช้ให้กับ Firebase
ขั้นตอนถัดไป
หลังจากที่ผู้ใช้ลงชื่อเข้าใช้เป็นครั้งแรก ระบบจะสร้างบัญชีผู้ใช้ใหม่และลิงก์กับข้อมูลเข้าสู่ระบบที่ผู้ใช้ลงชื่อเข้าใช้ ซึ่งได้แก่ ชื่อผู้ใช้และรหัสผ่าน หมายเลขโทรศัพท์ หรือข้อมูลผู้ให้บริการตรวจสอบสิทธิ์ ระบบจะจัดเก็บบัญชีใหม่นี้เป็นส่วนหนึ่งของโปรเจ็กต์ Firebase และสามารถใช้เพื่อระบุผู้ใช้ในทุกแอปในโปรเจ็กต์ได้ ไม่ว่าผู้ใช้จะลงชื่อเข้าใช้ด้วยวิธีใดก็ตามในแอป คุณสามารถรับข้อมูลโปรไฟล์พื้นฐานของผู้ใช้จากออบเจ็กต์ Firebase.Auth.FirebaseUser ได้ ดูจัดการผู้ใช้
ในกฎความปลอดภัยของฐานข้อมูลเรียลไทม์ของ Firebase และ Cloud Storage คุณสามารถรับรหัสผู้ใช้ที่ไม่ซ้ำกันของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร auth และใช้รหัสดังกล่าวเพื่อควบคุมข้อมูลที่ผู้ใช้เข้าถึงได้