ตรวจสอบสิทธิ์ด้วย Firebase โดยใช้หมายเลขโทรศัพท์ด้วย Unity

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

เอกสารนี้อธิบายวิธีใช้ขั้นตอนการลงชื่อเข้าใช้หมายเลขโทรศัพท์ด้วย Firebase SDK

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

  1. ก่อนที่จะใช้ การตรวจสอบสิทธิ์ของ Firebase ได้ คุณต้องเพิ่ม Firebase Unity SDK (โดยเฉพาะ FirebaseAuth.unitypackage) ไปยังโปรเจ็กต์ Unity

    ดูวิธีการโดยละเอียดสำหรับขั้นตอนการตั้งค่าเริ่มต้นเหล่านี้ได้ในเพิ่ม Firebase ในโปรเจ็กต์ Unity

  2. หากยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้เชื่อมต่อจากคอนโซล Firebase
  3. ทำความเข้าใจข้อกำหนดของแพลตฟอร์มสำหรับการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์
    • การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์มีไว้สำหรับแพลตฟอร์มอุปกรณ์เคลื่อนที่เท่านั้น
    • ใน iOS การลงชื่อเข้าใช้หมายเลขโทรศัพท์ต้องใช้อุปกรณ์จริงและไม่สามารถใช้กับเครื่องจำลองได้

ข้อกังวลด้านความปลอดภัย

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

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

เปิดใช้การลงชื่อเข้าใช้หมายเลขโทรศัพท์สำหรับโปรเจ็กต์ Firebase

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

  1. ในคอนโซล Firebase ให้เปิดส่วนการตรวจสอบสิทธิ์
  2. ในหน้าวิธีการลงชื่อเข้าใช้ ให้เปิดใช้วิธีการลงชื่อเข้าใช้หมายเลขโทรศัพท์

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

เริ่มรับการแจ้งเตือน APN (iOS เท่านั้น)

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

หากต้องการเปิดใช้การแจ้งเตือน APN เพื่อใช้กับการตรวจสอบสิทธิ์ Firebase ให้ทำดังนี้

  1. ใน Xcode ให้ เปิดใช้ข้อความ Push สำหรับโปรเจ็กต์
  2. อัปโหลดใบรับรอง APNs ไปยัง Firebase หากคุณยังไม่มีใบรับรอง APNs โปรดสร้างในศูนย์สมาชิกนักพัฒนาซอฟต์แวร์ของ Apple

    1. ภายในโปรเจ็กต์ในคอนโซล Firebase ให้เลือก ไอคอนรูปเฟือง เลือก การตั้งค่าโปรเจ็กต์ แล้วเลือกแท็บ Cloud Messaging

    2. เลือกปุ่มอัปโหลดใบรับรองสำหรับใบรับรองการพัฒนา ใบรับรองเวอร์ชันที่ใช้งานจริง หรือทั้ง 2 อย่าง โดยต้องระบุอย่างน้อย 1 รายการ

    3. สำหรับใบรับรองแต่ละรายการ ให้เลือกไฟล์ .p12 และใส่รหัสผ่าน (หากมี) ตรวจสอบว่ารหัสชุดสำหรับใบรับรองนี้ตรงกับรหัสชุดของแอป เลือกบันทึก

ส่งรหัสยืนยันไปยังโทรศัพท์ของผู้ใช้

หากต้องการเริ่มลงชื่อเข้าใช้หมายเลขโทรศัพท์ ให้แสดงอินเทอร์เฟซที่แจ้งให้ผู้ใช้ระบุหมายเลขโทรศัพท์ของตน แล้วโทรไปที่ PhoneAuthProvider.VerifyPhoneNumber เพื่อขอให้ Firebase ส่งรหัสการตรวจสอบสิทธิ์ไปยังโทรศัพท์ของผู้ใช้ทาง SMS โดยทำดังนี้

  1. ดูหมายเลขโทรศัพท์ของผู้ใช้

    ข้อกำหนดทางกฎหมายอาจแตกต่างกันออกไป แต่แนวทางปฏิบัติแนะนำและเพื่อกำหนดความคาดหวังของผู้ใช้ คุณควรแจ้งให้ผู้ใช้ทราบว่าหากผู้ใช้ลงชื่อเข้าใช้ทางโทรศัพท์ ผู้ใช้อาจได้รับข้อความ SMS สำหรับการยืนยัน และอาจต้องเสียค่าใช้จ่ายตามอัตรามาตรฐาน

  2. โทรหา 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.VerifyPhoneNumber, Firebase,
    • (ใน iOS) จะส่งข้อความ Push แบบไม่มีเสียงไปยังแอปของคุณ
    • Firebase จะส่งข้อความ SMS ที่มีรหัสการตรวจสอบสิทธิ์ไปยังหมายเลขโทรศัพท์ที่ระบุ และส่งรหัสการยืนยันไปยังฟังก์ชันการดำเนินการเสร็จสมบูรณ์ คุณจะต้องมีทั้งรหัสยืนยันและรหัสยืนยันเพื่อลงชื่อเข้าใช้ให้กับผู้ใช้
  3. บันทึกรหัสการยืนยันและคืนค่ารหัสเมื่อแอปของคุณโหลด การทำเช่นนี้จะช่วยให้คุณมีรหัสการยืนยันที่ถูกต้องหากแอปถูกสิ้นสุดการดำเนินงานก่อนที่ผู้ใช้จะลงชื่อเข้าใช้เสร็จสมบูรณ์ (เช่น ขณะเปลี่ยนไปใช้แอป SMS)

    คุณจะยืนยันรหัสการยืนยันได้ตามต้องการ วิธีง่ายๆ คือการบันทึกรหัสยืนยันด้วย UnityEngine.PlayerPrefs

หากมีการเรียกใช้การติดต่อกลับที่ส่งไปยัง codeSent คุณสามารถแจ้งให้ผู้ใช้พิมพ์รหัสยืนยันเมื่อได้รับรหัสในข้อความ SMS

ในทางกลับกัน หากมีการเรียกกลับสำหรับ verificationCompleted แสดงว่าการยืนยันอัตโนมัติสำเร็จและตอนนี้คุณมี PhoneAuthCredential ที่ใช้ได้ตามที่อธิบายไว้ด้านล่าง

ลงชื่อเข้าใช้ผู้ใช้ด้วยรหัสยืนยัน

หลังจากที่ผู้ใช้ให้รหัสยืนยันจากข้อความ SMS แก่แอปของคุณแล้ว ให้ลงชื่อเข้าใช้ผู้ใช้ด้วยการสร้างออบเจ็กต์ PhoneAuthCredential จากรหัสยืนยันและรหัสการยืนยัน แล้วส่งออบเจ็กต์นั้นไปยัง FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync

  1. รับรหัสยืนยันจากผู้ใช้
  2. สร้างออบเจ็กต์ Credential จากรหัสยืนยันและรหัสการยืนยัน
    PhoneAuthCredential credential =
        phoneAuthProvider.GetCredential(verificationId, verificationCode);
        
  3. ลงชื่อเข้าใช้ผู้ใช้ด้วยออบเจ็กต์ 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();