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

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

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

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

  1. ก่อนที่จะใช้ Firebase Authentication, คุณต้องเพิ่ม Firebase Unity SDK (โดยเฉพาะ FirebaseAuth.unitypackage) ลงในโปรเจ็กต์ Unity

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

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

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

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

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

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

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

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

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

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

วิธีเปิดใช้การแจ้งเตือน APNs เพื่อใช้กับ Firebase Authentication

  1. ใน Xcode ให้เปิดใช้การแจ้งเตือนแบบพุชสำหรับโปรเจ็กต์
  2. อัปโหลดใบรับรอง APNs ไปยัง Firebase หากยังไม่มีใบรับรอง APNs โปรดสร้างใบรับรองใน Apple Developer Member Center

    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) =&gt {
        // 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) =&gt {
        // The verification code was not sent.
        // `error` contains a human readable explanation of the problem.
      },
      codeSent: (id, token) =&gt {
        // 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) =&gt {
        // 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) ส่งการแจ้งเตือนแบบพุชเงียบไปยังแอปของคุณ
    • 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 =&gt {
      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();