คุณสามารถใช้ Firebase Authentication เพื่อลงชื่อเข้าใช้ผู้ใช้โดยส่งข้อความ SMS ไปยังโทรศัพท์ของผู้ใช้ โดยผู้ใช้จะลงชื่อเข้าใช้โดยใช้รหัสแบบใช้ครั้งเดียวที่อยู่ในข้อความ SMS
เอกสารนี้อธิบายวิธีใช้ขั้นตอนการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์โดยใช้ Firebase SDK
ก่อนเริ่มต้น
-
ก่อนที่จะใช้ Firebase Authentication, คุณต้องเพิ่ม Firebase Unity SDK (โดยเฉพาะ
FirebaseAuth.unitypackage) ลงในโปรเจ็กต์ Unityดูวิธีการตั้งค่าเริ่มต้นโดยละเอียดได้ที่หัวข้อ เพิ่ม Firebase ลงในโปรเจ็กต์ Unity.
- หากยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้ดำเนินการจาก Firebaseคอนโซล
- ทำความเข้าใจข้อกำหนดของแพลตฟอร์มสำหรับการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์
- การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์มีไว้สำหรับแพลตฟอร์มอุปกรณ์เคลื่อนที่เท่านั้น
- ใน iOS การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ต้องใช้อุปกรณ์จริงและจะใช้งานไม่ได้ในโปรแกรมจำลอง
ข้อกังวลด้านความปลอดภัย
การตรวจสอบสิทธิ์โดยใช้หมายเลขโทรศัพท์เพียงอย่างเดียว แม้จะสะดวก แต่ก็มีความปลอดภัยน้อยกว่าวิธีอื่นๆ ที่มีอยู่ เนื่องจากผู้ใช้สามารถโอนสิทธิ์การเป็นเจ้าของหมายเลขโทรศัพท์ระหว่างกันได้ง่าย นอกจากนี้ ในอุปกรณ์ที่มีโปรไฟล์ผู้ใช้หลายโปรไฟล์ ผู้ใช้ที่รับข้อความ SMS ได้จะลงชื่อเข้าใช้บัญชีโดยใช้หมายเลขโทรศัพท์ของอุปกรณ์ได้
หากคุณใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ในแอป คุณควรเสนอการลงชื่อเข้าใช้ด้วยวิธีที่ปลอดภัยกว่าควบคู่กันไป และแจ้งให้ผู้ใช้ทราบถึงข้อเสียด้านความปลอดภัยของการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์
เปิดใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์สำหรับโปรเจ็กต์ Firebase
หากต้องการให้ผู้ใช้ลงชื่อเข้าใช้ด้วย SMS คุณต้องเปิดใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์สำหรับโปรเจ็กต์ Firebase ก่อน โดยทำดังนี้
- ในคอนโซล Firebase ให้ไปที่ความปลอดภัย > การตรวจสอบสิทธิ์
- ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการการลงชื่อเข้าใช้ด้วยโทรศัพท์
-
กำหนดนโยบายเกี่ยวกับภูมิภาคที่คุณต้องการอนุญาตหรือไม่อนุญาตให้ส่งข้อความ SMS
การกำหนดนโยบายภูมิภาค SMS จะช่วยปกป้องแอปของคุณจากการละเมิด SMS ได้ สำหรับโปรเจ็กต์ใหม่ นโยบายเริ่มต้นจะไม่อนุญาตภูมิภาคใดเลย
- ในคอนโซลFirebase ให้ไปที่แท็บ ความปลอดภัย > การตรวจสอบสิทธิ์ > การตั้งค่า
- ในส่วนนโยบายภูมิภาค SMS ให้ตั้งค่านโยบายภูมิภาค SMS
เริ่มรับการแจ้งเตือน APNs (iOS เท่านั้น)
หากต้องการใช้การตรวจสอบสิทธิ์ด้วยหมายเลขโทรศัพท์ใน iOS แอปของคุณต้องรับการแจ้งเตือน APNs จาก Firebase ได้ เมื่อคุณลงชื่อเข้าใช้ผู้ใช้ด้วยหมายเลขโทรศัพท์ เป็นครั้งแรกในอุปกรณ์ Firebase Authentication จะส่งการแจ้งเตือนแบบพุชเงียบ ไปยังอุปกรณ์เพื่อยืนยันว่าคำขอลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์มาจาก แอปของคุณ (ด้วยเหตุนี้จึงไม่สามารถใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ใน โปรแกรมจำลองได้)
วิธีเปิดใช้การแจ้งเตือน APNs เพื่อใช้กับ Firebase Authentication
- ใน Xcode ให้เปิดใช้การแจ้งเตือนแบบพุชสำหรับโปรเจ็กต์
อัปโหลดใบรับรอง APNs ไปยัง Firebase หากยังไม่มีใบรับรอง APNs โปรดสร้างใบรับรองใน Apple Developer Member Center
-
ในคอนโซล Firebase ให้ไปที่
การตั้งค่า > ทั่วไป จากนั้นคลิกแท็บ Cloud Messaging - คลิก อัปโหลดใบรับรอง สำหรับใบรับรองการพัฒนา ใบรับรองเวอร์ชันที่ใช้งานจริง หรือทั้ง 2 อย่าง คุณต้องมีใบรับรองอย่างน้อย 1 รายการ
-
สำหรับใบรับรองแต่ละรายการ ให้เลือกไฟล์
.p12และระบุรหัสผ่าน (หากมี) ตรวจสอบว่ารหัสชุดสำหรับใบรับรองนี้ตรงกับรหัสชุดของแอป แล้วคลิกบันทึก
-
ในคอนโซล Firebase ให้ไปที่
ส่งรหัสยืนยันไปยังโทรศัพท์ของผู้ใช้
หากต้องการเริ่มการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ ให้แสดงอินเทอร์เฟซที่แจ้ง
ให้ผู้ใช้ระบุหมายเลขโทรศัพท์ จากนั้นเรียกใช้
PhoneAuthProvider.VerifyPhoneNumber เพื่อขอให้ Firebase
ส่งรหัสยืนยันไปยังโทรศัพท์ของผู้ใช้ทาง SMS โดยทำดังนี้
-
รับหมายเลขโทรศัพท์ของผู้ใช้
ข้อกำหนดทางกฎหมายอาจแตกต่างกันไป แต่แนวทางปฏิบัติแนะนำคือคุณควรแจ้งให้ผู้ใช้ทราบว่าหากใช้การลงชื่อเข้าใช้ด้วยโทรศัพท์ ผู้ใช้อาจได้รับข้อความ SMS สำหรับการยืนยันและจะมีค่าบริการมาตรฐาน
- เรียกใช้
PhoneAuthProvider.VerifyPhoneNumberโดยส่ง PhoneAuthOptions ที่มีหมายเลขโทรศัพท์ของผู้ใช้ไปยังฟังก์ชันดังกล่าว เมื่อคุณเรียกใช้PhoneAuthProvider provider = PhoneAuthProvider.GetInstance(firebaseAuth); provider.VerifyPhoneNumber( new Firebase.Auth.PhoneAuthOptions { PhoneNumber = phoneNumber, TimeoutInMilliseconds = phoneAuthTimeoutMs, ForceResendingToken = null }, verificationCompleted: (credential) => { // Auto-sms-retrieval or instant validation has succeeded (Android only). // There is no need to input the verification code. // `credential` can be used instead of calling GetCredential(). }, verificationFailed: (error) => { // The verification code was not sent. // `error` contains a human readable explanation of the problem. }, codeSent: (id, token) => { // Verification code was successfully sent via SMS. // `id` contains the verification id that will need to passed in with // the code from the user when calling GetCredential(). // `token` can be used if the user requests the code be sent again, to // tie the two requests together. }, codeAutoRetrievalTimeout: (id) => { // Called when the auto-sms-retrieval has timed out, based on the given // timeout parameter. // `id` contains the verification id of the request that timed out. });
PhoneAuthProvider.VerifyPhoneNumberFirebase จะดำเนินการดังนี้- (ใน iOS) ส่งการแจ้งเตือนแบบพุชเงียบไปยังแอปของคุณ
- Firebase จะส่งข้อความ SMS ที่มีรหัสยืนยัน ไปยังหมายเลขโทรศัพท์ที่ระบุและส่งรหัสยืนยันไปยังฟังก์ชันการดำเนินการให้เสร็จสมบูรณ์ คุณจะต้องใช้ทั้งรหัสยืนยัน และรหัสยืนยันเพื่อลงชื่อเข้าใช้ผู้ใช้
-
บันทึกรหัสยืนยันและกู้คืนเมื่อแอปโหลด การดำเนินการดังกล่าวจะช่วยให้คุณมีรหัสยืนยันที่ถูกต้องอยู่เสมอหากแอปสิ้นสุดลงก่อนที่ผู้ใช้จะทำขั้นตอนการลงชื่อเข้าใช้เสร็จสมบูรณ์ (เช่น ขณะเปลี่ยนไปใช้แอป SMS)
คุณสามารถเก็บรหัสยืนยันไว้ได้ทุกวิธีที่ต้องการ วิธีง่ายๆ คือการ บันทึกรหัสยืนยันด้วย
UnityEngine.PlayerPrefs
หากมีการเรียกใช้การเรียกกลับที่ส่งไปยัง codeSent คุณสามารถแจ้งให้ผู้ใช้พิมพ์รหัสยืนยันเมื่อได้รับรหัสในข้อความ SMS
ในทางกลับกัน หากมีการเรียกใช้การเรียกกลับสำหรับ verificationCompleted แสดงว่าการยืนยันอัตโนมัติสำเร็จแล้ว และตอนนี้คุณจะมี PhoneAuthCredential ที่ใช้ได้ตามที่อธิบายไว้ด้านล่าง
ลงชื่อเข้าใช้ผู้ใช้ด้วยรหัสยืนยัน
หลังจากที่ผู้ใช้ระบุรหัสยืนยันจากข้อความ SMS
ให้แอปของคุณแล้ว ให้ลงชื่อเข้าใช้ผู้ใช้โดยสร้างออบเจ็กต์ PhoneAuthCredential
จากรหัสยืนยันและรหัสยืนยัน แล้วส่งออบเจ็กต์ดังกล่าว
ไปยัง FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync
- รับรหัสยืนยันจากผู้ใช้
- สร้างออบเจ็กต์
Credentialจากรหัสยืนยัน และรหัสยืนยันPhoneAuthCredential credential = phoneAuthProvider.GetCredential(verificationId, verificationCode);
- ลงชื่อเข้าใช้ผู้ใช้ด้วยออบเจ็กต์
PhoneAuthCredentialโดยทำดังนี้auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => { if (task.IsFaulted) { Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception); return; } FirebaseUser newUser = task.Result.User; Debug.Log("User signed in successfully"); // This should display the phone number. Debug.Log("Phone number: " + newUser.PhoneNumber); // The phone number providerID is 'phone'. Debug.Log("Phone provider ID: " + newUser.ProviderId); });
ขั้นตอนถัดไป
หลังจากที่ผู้ใช้ลงชื่อเข้าใช้เป็นครั้งแรก ระบบจะสร้างบัญชีผู้ใช้ใหม่และลิงก์กับข้อมูลเข้าสู่ระบบ ซึ่งได้แก่ ชื่อผู้ใช้และรหัสผ่าน หมายเลขโทรศัพท์ หรือข้อมูลผู้ให้บริการการตรวจสอบสิทธิ์ที่ผู้ใช้ใช้ลงชื่อเข้าใช้ ระบบจะจัดเก็บบัญชีใหม่นี้เป็นส่วนหนึ่งของโปรเจ็กต์ Firebase และสามารถใช้เพื่อระบุผู้ใช้ในทุกแอปในโปรเจ็กต์ได้ ไม่ว่าผู้ใช้จะลงชื่อเข้าใช้ด้วยวิธีใดก็ตาม
-
ในแอป คุณสามารถรับข้อมูลโปรไฟล์พื้นฐานของผู้ใช้จากออบเจ็กต์
Firebase.Auth.FirebaseUserได้ดังนี้Firebase.Auth.FirebaseUser user = auth.CurrentUser; if (user != null) { string name = user.DisplayName; string email = user.Email; System.Uri photo_url = user.PhotoUrl; // The user's Id, unique to the Firebase project. // Do NOT use this value to authenticate with your backend server, if you // have one; use User.TokenAsync() instead. string uid = user.UserId; }
ใน Firebase Realtime Database และ Cloud Storage กฎความปลอดภัย คุณสามารถ รับรหัสผู้ใช้ที่ไม่ซ้ำกันของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร
authและใช้รหัสดังกล่าวเพื่อควบคุมข้อมูลที่ผู้ใช้เข้าถึงได้
คุณสามารถอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้แอปโดยใช้ผู้ให้บริการการตรวจสอบสิทธิ์หลายรายได้โดยการลิงก์ข้อมูลเข้าสู่ระบบของผู้ให้บริการการตรวจสอบสิทธิ์กับบัญชีผู้ใช้ที่มีอยู่
หากต้องการลงชื่อออกจากระบบของผู้ใช้ ให้เรียกใช้
SignOut() โดยทำดังนี้
auth.SignOut();