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

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

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

ก่อนที่คุณจะเริ่มต้น

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

    ค้นหาคำแนะนำโดยละเอียดสำหรับขั้นตอนการตั้งค่าเริ่มต้นเหล่านี้ใน Add Firebase to your Unity project

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

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

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

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

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

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

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

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

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

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

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

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

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

    2. เลือกปุ่ม อัปโหลดใบรับรอง สำหรับใบรับรองการพัฒนา ใบรับรองการผลิต หรือทั้งสองอย่าง ต้องมีอย่างน้อยหนึ่งรายการ

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

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

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

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

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

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

  1. รับรหัสยืนยันจากผู้ใช้
  2. สร้าง Credential object จากรหัสยืนยันและรหัสยืนยัน
    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 คุณสามารถรับ ID ผู้ใช้ที่ไม่ซ้ำกันของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร auth และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้สามารถเข้าถึงได้

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

หากต้องการลงชื่อออกจากผู้ใช้ ให้โทร SignOut() :

auth.SignOut();