คุณสามารถใช้ Firebase Authentication เพื่อลงชื่อเข้าใช้ให้ผู้ใช้ได้โดยส่งข้อความ SMS ลงในโทรศัพท์ของผู้ใช้ ผู้ใช้ลงชื่อเข้าใช้ด้วยรหัสแบบใช้ครั้งเดียวที่มีอยู่ใน ข้อความ SMS
วิธีที่ง่ายที่สุดในการเพิ่มการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ลงในแอปคือการใช้ Firebase UI ซึ่งรวมถึงวิดเจ็ตการลงชื่อเข้าใช้ที่ใช้ขั้นตอนการลงชื่อเข้าใช้สำหรับโทรศัพท์ การลงชื่อเข้าใช้ด้วยหมายเลข รวมถึงการลงชื่อเข้าใช้ด้วยรหัสผ่านและแบบรวมศูนย์ เอกสารนี้ อธิบายวิธีใช้ขั้นตอนการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ด้วย Firebase SDK
ก่อนเริ่มต้น
- หากยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้ดำเนินการจาก คอนโซล Firebase
-
ใช้ Swift Package Manager เพื่อติดตั้งและจัดการทรัพยากร Dependency ของ Firebase
- เปิดโปรเจ็กต์แอปใน Xcode แล้วไปที่ไฟล์ > เพิ่มแพ็กเกจ
- เมื่อได้รับข้อความแจ้ง ให้เพิ่มที่เก็บ SDK สำหรับแพลตฟอร์ม Firebase ของ Apple ดังนี้
- เลือกไลบรารี Firebase Authentication
- เพิ่มแฟล็ก
-ObjC
ลงในส่วนแฟล็ก Linker อื่นๆ ของการตั้งค่าบิลด์ของเป้าหมาย - เมื่อเสร็จแล้ว Xcode จะเริ่มแก้ปัญหาและดาวน์โหลด ทรัพยากร Dependency ในเบื้องหลัง
https://github.com/firebase/firebase-ios-sdk.git
ข้อกังวลด้านความปลอดภัย
การตรวจสอบสิทธิ์โดยใช้เพียงหมายเลขโทรศัพท์มีความปลอดภัยน้อยกว่า วิธีการอื่นๆ ที่มีอยู่ เพราะการมีหมายเลขโทรศัพท์ สามารถถ่ายโอนระหว่างผู้ใช้ได้อย่างง่ายดาย นอกจากนี้ ในอุปกรณ์ที่มีผู้ใช้หลายคน ผู้ใช้ที่สามารถรับข้อความ SMS จะสามารถลงชื่อเข้าใช้บัญชีโดยใช้ หมายเลขโทรศัพท์ของอุปกรณ์
หากใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ในแอป คุณควรเสนอ ควบคู่กับวิธีการลงชื่อเข้าใช้ที่ปลอดภัยยิ่งขึ้น และแจ้งให้ผู้ใช้ทราบเกี่ยวกับความปลอดภัย ข้อดีข้อเสียของการใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์
เปิดใช้การลงชื่อเข้าใช้หมายเลขโทรศัพท์สำหรับโปรเจ็กต์ Firebase
หากต้องการลงชื่อเข้าใช้ให้ผู้ใช้ทาง SMS คุณต้องเปิดใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ก่อน สำหรับโปรเจ็กต์ Firebase ของคุณ
- เปิดส่วนการตรวจสอบสิทธิ์ในคอนโซล Firebase
- ในหน้าวิธีการลงชื่อเข้าใช้ ให้เปิดใช้หมายเลขโทรศัพท์ วิธีลงชื่อเข้าใช้
เปิดใช้การตรวจสอบแอป
หากต้องการใช้การตรวจสอบสิทธิ์หมายเลขโทรศัพท์ Firebase ต้องสามารถยืนยันว่า คำขอลงชื่อเข้าใช้หมายเลขโทรศัพท์มาจากแอปของคุณ ซึ่งมี 2 วิธี Firebase Authentication บรรลุเป้าหมายนี้:
- การแจ้งเตือน APN แบบปิดเสียง: เมื่อคุณลงชื่อเข้าใช้ด้วยบัญชีของผู้ใช้
หมายเลขโทรศัพท์เป็นครั้งแรกในอุปกรณ์ Firebase Authentication จะส่งหมายเลข
โทเค็นไปยังอุปกรณ์โดยใช้ข้อความ Push แบบปิดเสียง หากแอปของคุณ
ได้รับการแจ้งเตือนจาก Firebase หมายเลขโทรศัพท์เรียบร้อยแล้ว
สามารถดำเนินการต่อได้
สำหรับ iOS 8.0 ขึ้นไป ไม่จำเป็นต้องมีการแจ้งเตือนที่ชัดเจน ความยินยอมของผู้ใช้ ดังนั้นจึงไม่ได้รับผลกระทบจากการที่ผู้ใช้ปฏิเสธที่จะรับ การแจ้งเตือน APN ในแอป ดังนั้น แอปไม่จำเป็นต้องส่งคำขอผู้ใช้ สิทธิ์ในการรับข้อความ Push เมื่อใช้โทรศัพท์ Firebase การตรวจสอบสิทธิ์หมายเลข
- การยืนยัน reCAPTCHA: ในกรณีที่การส่งหรือรับ ข้อความ Push แบบไม่มีเสียงจะไม่สามารถทำได้ เช่น เมื่อผู้ใช้ ปิดการรีเฟรชเบื้องหลังสำหรับแอปของคุณ หรือเมื่อทดสอบแอปใน เครื่องจำลอง iOS ชื่อ Firebase Authentication ใช้การยืนยัน reCAPTCHA ให้เสร็จสมบูรณ์ ขั้นตอนการลงชื่อเข้าใช้โทรศัพท์ มักทำโจทย์ reCAPTCHA ได้ โดยที่ผู้ใช้ไม่ต้องแก้ไขอะไรเลย
เมื่อมีการกำหนดค่าข้อความ Push แบบไม่มีเสียงอย่างถูกต้อง เปอร์เซ็นต์ของผู้ใช้จะได้สัมผัสกับโฟลว์ reCAPTCHA อย่างไรก็ตาม คุณควร ตรวจสอบว่าการลงชื่อเข้าใช้หมายเลขโทรศัพท์ทำงานอย่างถูกต้อง ไม่ว่าจะเป็นการกดปิดเสียงหรือไม่ มีการแจ้งเตือน รายการ
เริ่มรับการแจ้งเตือนแบบไม่มีเสียง
หากต้องการเปิดใช้การแจ้งเตือน APN เพื่อใช้กับ Firebase Authentication ให้ทำดังนี้
- ใน Xcode เปิดใช้ข้อความ Push สําหรับโปรเจ็กต์
-
อัปโหลดคีย์การตรวจสอบสิทธิ์ APN ไปยัง Firebase หากคุณยังไม่มีคีย์การตรวจสอบสิทธิ์ APNs โปรดสร้างคีย์ใน Apple Developer Member Center
-
ภายในโปรเจ็กต์ในคอนโซล Firebase ให้เลือก ไอคอนรูปเฟือง, เลือก การตั้งค่าโปรเจ็กต์ แล้วเลือก แท็บการรับส่งข้อความในระบบคลาวด์
-
ในคีย์การตรวจสอบสิทธิ์ AAP ในส่วนการกำหนดค่าแอป iOS ให้คลิกอัปโหลด
-
เรียกดูตำแหน่งที่คุณบันทึกกุญแจไว้ จากนั้นเลือกคีย์แล้วคลิก เปิด เพิ่มรหัสคีย์สำหรับคีย์ (มีอยู่ใน Apple Developer Member Center) แล้วคลิก อัปโหลด
หากมีใบรับรอง APNs อยู่แล้ว คุณสามารถอัปโหลดใบรับรอง แทน
-
- ใน Xcode เปิดใช้ความสามารถของโหมดพื้นหลังสำหรับโปรเจ็กต์ จากนั้นเลือกช่องทำเครื่องหมายสำหรับ โหมดการดึงข้อมูลในเบื้องหลังและการแจ้งเตือนระยะไกล
ตั้งค่าการยืนยัน reCAPTCHA
วิธีเปิดใช้ Firebase SDK เพื่อใช้การยืนยัน reCAPTCHA
- เพิ่มสคีม URL ที่กำหนดเองลงในโปรเจ็กต์ Xcode ดังนี้
- เปิดการกำหนดค่าโปรเจ็กต์: ดับเบิลคลิกชื่อโปรเจ็กต์ใน มุมมองต้นไม้ด้านซ้าย เลือกแอปจากส่วนเป้าหมาย จากนั้น เลือกแท็บข้อมูล และขยายส่วนประเภท URL
- คลิกปุ่ม + แล้วเพิ่มรหัสแอปที่เข้ารหัสเป็น URL
สคีม คุณดูรหัสแอปที่เข้ารหัสได้ใน
ข้อมูลทั่วไป
การตั้งค่าของคอนโซล Firebase ในส่วนสำหรับ iOS
แอป เว้นฟิลด์อื่นๆ ว่างไว้
เมื่อดำเนินการเสร็จแล้ว ค่ากำหนดของคุณควรมีลักษณะคล้ายกับ ดังต่อไปนี้ (แต่เป็นค่าเฉพาะแอปพลิเคชัน)
- ไม่บังคับ: หากต้องการปรับแต่งวิธีที่แอปนำเสนอ
SFSafariViewController
เมื่อแสดง reCAPTCHA ต่อผู้ใช้ ให้สร้าง reCAPTCHA ที่สอดคล้องกับโปรโตคอลAuthUIDelegate
และส่งไปยังverifyPhoneNumber(_:uiDelegate:completion:)
ส่งรหัสยืนยันไปยังโทรศัพท์ของผู้ใช้
หากต้องการเริ่มลงชื่อเข้าใช้หมายเลขโทรศัพท์ ให้แสดงอินเทอร์เฟซที่แจ้งแก่ผู้ใช้
ให้พวกเขาระบุหมายเลขโทรศัพท์ แล้วโทร
verifyPhoneNumber(_:uiDelegate:completion:)
เพื่อขอให้ Firebase
ส่งรหัสการตรวจสอบสิทธิ์ไปยังโทรศัพท์ของผู้ใช้ทาง SMS
-
ดูหมายเลขโทรศัพท์ของผู้ใช้
ข้อกำหนดทางกฎหมายอาจแตกต่างกันไป แต่แนวทางปฏิบัติแนะนำคือ และเพื่อกำหนดความคาดหวังให้กับผู้ใช้ คุณควรแจ้งให้ผู้ใช้ทราบว่าถ้าพวกเขาใช้ ลงชื่อเข้าใช้ทางโทรศัพท์ ผู้ใช้อาจได้รับข้อความ SMS สำหรับการยืนยันและ มีค่าบริการ
- โทรหา
verifyPhoneNumber(_:uiDelegate:completion:)
ผ่านเลย หมายเลขโทรศัพท์ของผู้ใช้Swift
PhoneAuthProvider.provider() .verifyPhoneNumber(phoneNumber, uiDelegate: nil) { verificationID, error in if let error = error { self.showMessagePrompt(error.localizedDescription) return } // Sign in using the verificationID and the code sent to the user // ... }
Objective-C
[[FIRPhoneAuthProvider provider] verifyPhoneNumber:userInput UIDelegate:nil completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) { if (error) { [self showMessagePrompt:error.localizedDescription]; return; } // Sign in using the verificationID and the code sent to the user // ... }];
ใช้เมธอด
verifyPhoneNumber
ซ้ำ: หากคุณเรียกใช้เมธอดหลายครั้ง เช่น ในเมธอดonAppear
ของข้อมูลพร็อพเพอร์ตี้ เมธอดverifyPhoneNumber
จะไม่ ส่ง SMS ครั้งที่ 2 เว้นแต่ว่าคำขอเดิมจะหมดเวลาเมื่อคุณโทรหา
verifyPhoneNumber(_:uiDelegate:completion:)
Firebase จะส่งข้อความ Push แบบไม่มีเสียงไปยังแอปของคุณ หรือออก ภาพทดสอบ reCAPTCHA ของผู้ใช้ หลังจากที่แอปได้รับ หรือผู้ใช้ตอบ reCAPTCHA, Firebase จนเสร็จสิ้น ส่งข้อความ SMS ที่มีรหัสการตรวจสอบสิทธิ์ไปยัง หมายเลขโทรศัพท์ที่ระบุ และส่งรหัสการยืนยันไปยังขั้นตอนให้เสร็จสมบูรณ์ คุณจะต้องมีทั้งรหัสยืนยันและรหัสยืนยัน รหัสเพื่อลงชื่อเข้าใช้ผู้ใช้ข้อความ SMS ที่ส่งโดย Firebase ยังสามารถแปลได้โดยระบุ ภาษาการตรวจสอบสิทธิ์ผ่านพร็อพเพอร์ตี้
languageCode
ในการตรวจสอบสิทธิ์ อินสแตนซ์Swift
// Change language code to french. Auth.auth().languageCode = "fr";
Objective-C
// Change language code to french. [FIRAuth auth].languageCode = @"fr";
-
บันทึกรหัสการยืนยันและคืนค่ารหัสเมื่อแอปของคุณโหลด เมื่อทำเช่นนั้น คุณจึงมั่นใจได้ว่ายังมีรหัสยืนยันที่ถูกต้องอยู่หากแอป ถูกสิ้นสุดการใช้งานก่อนที่ผู้ใช้จะดำเนินการตามขั้นตอนการลงชื่อเข้าใช้จนเสร็จสมบูรณ์ (เช่น เปลี่ยนไปใช้แอป SMS)
คุณจะยืนยันรหัสการยืนยันได้ตามต้องการ วิธีง่ายๆ คือ บันทึกรหัสยืนยันด้วยออบเจ็กต์
NSUserDefaults
:Swift
UserDefaults.standard.set(verificationID, forKey: "authVerificationID")
Objective-C
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:verificationID forKey:@"authVerificationID"];
จากนั้นคุณจะคืนค่าค่าที่บันทึกไว้ได้โดยทำดังนี้
Swift
let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")
Objective-C
NSString *verificationID = [defaults stringForKey:@"authVerificationID"];
หากโทรหา verifyPhoneNumber(_:uiDelegate:completion:)
สำเร็จ คุณสามารถแจ้งให้ผู้ใช้พิมพ์รหัสยืนยันเมื่อผู้ใช้
ได้รับข้อความ SMS
ลงชื่อเข้าใช้ผู้ใช้ด้วยรหัสยืนยัน
หลังจากที่ผู้ใช้ให้รหัสยืนยันจาก SMS แก่แอปของคุณ
ข้อความ โปรดลงชื่อเข้าใช้ให้ผู้ใช้ด้วยการสร้าง FIRPhoneAuthCredential
จากรหัสยืนยันและรหัสการยืนยัน และส่งผ่านออบเจ็กต์นั้น
ไปยัง signInWithCredential:completion:
- รับรหัสยืนยันจากผู้ใช้
- สร้างออบเจ็กต์
FIRPhoneAuthCredential
จากการยืนยัน รหัสและรหัสยืนยันSwift
let credential = PhoneAuthProvider.provider().credential( withVerificationID: verificationID, verificationCode: verificationCode )
Objective-C
FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID verificationCode:userInput];
- ลงชื่อเข้าใช้ผู้ใช้ด้วยออบเจ็กต์
FIRPhoneAuthCredential
:Swift
Auth.auth().signIn(with: credential) { authResult, error in if let error = error { let authError = error as NSError if isMFAEnabled, authError.code == AuthErrorCode.secondFactorRequired.rawValue { // The user is a multi-factor user. Second factor challenge is required. let resolver = authError .userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver var displayNameString = "" for tmpFactorInfo in resolver.hints { displayNameString += tmpFactorInfo.displayName ?? "" displayNameString += " " } self.showTextInputPrompt( withMessage: "Select factor to sign in\n\(displayNameString)", completionBlock: { userPressedOK, displayName in var selectedHint: PhoneMultiFactorInfo? for tmpFactorInfo in resolver.hints { if displayName == tmpFactorInfo.displayName { selectedHint = tmpFactorInfo as? PhoneMultiFactorInfo } } PhoneAuthProvider.provider() .verifyPhoneNumber(with: selectedHint!, uiDelegate: nil, multiFactorSession: resolver .session) { verificationID, error in if error != nil { print( "Multi factor start sign in failed. Error: \(error.debugDescription)" ) } else { self.showTextInputPrompt( withMessage: "Verification code for \(selectedHint?.displayName ?? "")", completionBlock: { userPressedOK, verificationCode in let credential: PhoneAuthCredential? = PhoneAuthProvider.provider() .credential(withVerificationID: verificationID!, verificationCode: verificationCode!) let assertion: MultiFactorAssertion? = PhoneMultiFactorGenerator .assertion(with: credential!) resolver.resolveSignIn(with: assertion!) { authResult, error in if error != nil { print( "Multi factor finanlize sign in failed. Error: \(error.debugDescription)" ) } else { self.navigationController?.popViewController(animated: true) } } } ) } } } ) } else { self.showMessagePrompt(error.localizedDescription) return } // ... return } // User is signed in // ... }
Objective-C
[[FIRAuth auth] signInWithCredential:credential completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (isMFAEnabled && error && error.code == FIRAuthErrorCodeSecondFactorRequired) { FIRMultiFactorResolver *resolver = error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey]; NSMutableString *displayNameString = [NSMutableString string]; for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) { [displayNameString appendString:tmpFactorInfo.displayName]; [displayNameString appendString:@" "]; } [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Select factor to sign in\n%@", displayNameString] completionBlock:^(BOOL userPressedOK, NSString *_Nullable displayName) { FIRPhoneMultiFactorInfo* selectedHint; for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) { if ([displayName isEqualToString:tmpFactorInfo.displayName]) { selectedHint = (FIRPhoneMultiFactorInfo *)tmpFactorInfo; } } [FIRPhoneAuthProvider.provider verifyPhoneNumberWithMultiFactorInfo:selectedHint UIDelegate:nil multiFactorSession:resolver.session completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) { if (error) { [self showMessagePrompt:error.localizedDescription]; } else { [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Verification code for %@", selectedHint.displayName] completionBlock:^(BOOL userPressedOK, NSString *_Nullable verificationCode) { FIRPhoneAuthCredential *credential = [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID verificationCode:verificationCode]; FIRMultiFactorAssertion *assertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential]; [resolver resolveSignInWithAssertion:assertion completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { if (error) { [self showMessagePrompt:error.localizedDescription]; } else { NSLog(@"Multi factor finanlize sign in succeeded."); } }]; }]; } }]; }]; } else if (error) { // ... return; } // User successfully signed in. Get user data from the FIRUser object if (authResult == nil) { return; } FIRUser *user = authResult.user; // ... }];
ทดสอบด้วยหมายเลขโทรศัพท์สมมติ
คุณตั้งค่าหมายเลขโทรศัพท์สมมติสำหรับการพัฒนาได้ผ่านคอนโซล Firebase การทดสอบด้วยโทรศัพท์สมมติ ตัวเลขมีประโยชน์ดังนี้
- ทดสอบการตรวจสอบสิทธิ์ของหมายเลขโทรศัพท์โดยไม่ใช้โควต้าการใช้งาน
- ทดสอบการตรวจสอบสิทธิ์หมายเลขโทรศัพท์โดยไม่ส่งข้อความ SMS จริง
- ทำการทดสอบติดต่อกันด้วยหมายเลขโทรศัพท์เดียวกันโดยไม่มีการควบคุม ช่วงเวลานี้ ลดความเสี่ยงในการปฏิเสธระหว่างกระบวนการตรวจสอบของ App Store หากผู้ตรวจสอบใช้งาน หมายเลขเดียวกันสำหรับการทดสอบ
- ทดสอบได้ทันทีในสภาพแวดล้อมในการพัฒนาซอฟต์แวร์โดยไม่ต้องดำเนินการใดๆ เพิ่มเติม เช่น สามารถพัฒนาโดยใช้โปรแกรมจำลอง iOS หรือโปรแกรมจำลองของ Android โดยไม่ใช้บริการ Google Play
- เขียนการทดสอบการผสานรวมโดยไม่ถูกบล็อกโดยการตรวจสอบความปลอดภัยที่ใช้ตามปกติ จากหมายเลขโทรศัพท์จริงในสภาพแวดล้อมการใช้งานจริง
หมายเลขโทรศัพท์สมมติต้องเป็นไปตามข้อกำหนดเหล่านี้
- ตรวจสอบว่าคุณใช้หมายเลขโทรศัพท์ที่สมมติขึ้นจริงๆ และยังไม่มีอยู่แล้ว Firebase Authentication ไม่อนุญาตให้คุณกำหนดหมายเลขโทรศัพท์ที่มีอยู่ซึ่งผู้ใช้จริงใช้เป็นหมายเลขทดสอบ ทางเลือกหนึ่งคือการใช้หมายเลข 555 นำหน้าเป็นหมายเลขโทรศัพท์ทดสอบในสหรัฐอเมริกา ตัวอย่างเช่น +6650-555-3434
- หมายเลขโทรศัพท์ต้องมีรูปแบบที่ถูกต้องสำหรับความยาวและหมายเลขอื่นๆ ข้อจำกัด ผู้ใช้จะยังผ่านขั้นตอนการตรวจสอบเดียวกับหมายเลขโทรศัพท์ของผู้ใช้จริง
- คุณเพิ่มหมายเลขโทรศัพท์สำหรับการพัฒนาได้สูงสุด 10 หมายเลข
- ใช้หมายเลขโทรศัพท์/รหัสทดสอบที่คาดเดาและเปลี่ยนแปลงได้ยาก เหล่านั้นบ่อยๆ
สร้างหมายเลขโทรศัพท์และรหัสยืนยันสมมติ
- ในคอนโซล Firebase ให้เปิด การตรวจสอบสิทธิ์
- ในแท็บวิธีการลงชื่อเข้าใช้ ให้เปิดใช้ผู้ให้บริการโทรศัพท์หากยังไม่ได้เปิดใช้
- เปิดเมนูหมายเลขโทรศัพท์สำหรับการทดสอบ
- ระบุหมายเลขโทรศัพท์ที่ต้องการทดสอบ เช่น +1 650-555-3434
- ระบุรหัสยืนยัน 6 หลักสำหรับหมายเลขนั้นๆ เช่น 654321
- เพิ่มหมายเลข หากมีความจำเป็น คุณสามารถลบหมายเลขโทรศัพท์นั้นแล้ว โดยวางเมาส์เหนือแถวที่เกี่ยวข้องแล้วคลิกไอคอนถังขยะ
การทดสอบด้วยตนเอง
คุณสามารถเริ่มใช้หมายเลขโทรศัพท์สมมติในแอปพลิเคชันได้โดยตรง วิธีนี้ช่วยให้คุณทำสิ่งต่อไปนี้ได้ ทำการทดสอบด้วยตนเองระหว่างขั้นตอนการพัฒนาโดยไม่พบปัญหาด้านโควต้าหรือการควบคุม คุณยังทดสอบจากเครื่องจำลอง iOS หรือโปรแกรมจำลองของ Android ได้โดยตรงโดยไม่ต้องใช้บริการ Google Play ติดตั้งไว้แล้ว
เมื่อคุณระบุหมายเลขโทรศัพท์สมมติและส่งรหัสยืนยัน จะไม่มีการส่ง SMS จริง ที่คุณส่งไป แต่คุณต้องป้อนรหัสยืนยันที่กำหนดค่าไว้ก่อนหน้านี้แทนเพื่อให้การลงนามเสร็จสมบูรณ์ นิ้ว
เมื่อลงชื่อเข้าใช้เสร็จแล้ว ระบบจะสร้างผู้ใช้ Firebase ด้วยหมายเลขโทรศัพท์ดังกล่าว ผู้ใช้มีพฤติกรรมและพร็อพเพอร์ตี้เหมือนกับผู้ใช้หมายเลขโทรศัพท์จริง และสามารถเข้าถึง Realtime Database/Cloud Firestore และบริการอื่นๆ ในลักษณะเดียวกัน โทเค็นรหัสที่สร้างในระหว่าง กระบวนการนี้จะมีลายเซ็นเหมือนกับผู้ใช้หมายเลขโทรศัพท์จริง
อีกตัวเลือกหนึ่งคือ กำหนดบทบาททดสอบผ่านที่กำหนดเอง การอ้างสิทธิ์กับผู้ใช้เหล่านี้เพื่อแบ่งแยกว่าเป็นผู้ใช้ปลอม หากคุณต้องการจำกัดยิ่งขึ้น สิทธิ์การเข้าถึง
การทดสอบการผสานรวม
นอกจากการทดสอบด้วยตนเองแล้ว Firebase Authentication ยังมี API เพื่อช่วยเขียนการทดสอบการผสานรวม สำหรับการทดสอบการตรวจสอบสิทธิ์ทางโทรศัพท์ API เหล่านี้จะปิดใช้การตรวจสอบแอปโดยการปิดใช้ reCAPTCHA ข้อกำหนดบนเว็บและข้อความ Push แบบปิดเสียงใน iOS จึงทําให้สามารถทดสอบการทำงานอัตโนมัติได้ใน ดำเนินการตามขั้นตอนเหล่านี้ได้ และปรับใช้ง่ายขึ้น นอกจากนี้ยังช่วยให้สามารถทดสอบ ขั้นตอนการยืนยันบน Android
ใน iOS ต้องตั้งค่า appVerificationDisabledForTesting
เป็น
TRUE
ก่อนโทรหา verifyPhoneNumber
ระบบจะประมวลผลได้โดยไม่ต้องมี
โทเค็น APN ทั้งหมดหรือส่งข้อความ Push แบบปิดเสียงในเบื้องหลัง ซึ่งช่วยให้ทดสอบได้ง่ายขึ้น
ในเครื่องมือจำลอง การดำเนินการนี้จะปิดใช้ขั้นตอนสำรองสำหรับ reCAPTCHA ด้วย
โปรดทราบว่าเมื่อปิดใช้การตรวจสอบแอป การใช้หมายเลขโทรศัพท์ที่ไม่ใช่หมายเลขสมมติจะ ลงชื่อเข้าใช้ไม่สำเร็จ ใช้ได้เฉพาะหมายเลขโทรศัพท์สมมติเท่านั้นกับ API นี้
Swift
let phoneNumber = "+16505554567" // This test verification code is specified for the given test phone number in the developer console. let testVerificationCode = "123456" Auth.auth().settings.isAppVerificationDisabledForTesting = TRUE PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate:nil) { verificationID, error in if (error) { // Handles error self.handleError(error) return } let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID ?? "", verificationCode: testVerificationCode) Auth.auth().signInAndRetrieveData(with: credential) { authData, error in if (error) { // Handles error self.handleError(error) return } _user = authData.user }]; }];
Objective-C
NSString *phoneNumber = @"+16505554567"; // This test verification code is specified for the given test phone number in the developer console. NSString *testVerificationCode = @"123456"; [FIRAuth auth].settings.appVerificationDisabledForTesting = YES; [[FIRPhoneAuthProvider provider] verifyPhoneNumber:phoneNumber completion:^(NSString *_Nullable verificationID, NSError *_Nullable error) { if (error) { // Handles error [self handleError:error]; return; } FIRAuthCredential *credential = [FIRPhoneAuthProvider credentialWithVerificationID:verificationID verificationCode:testVerificationCode]; [FIRAuth auth] signInWithAndRetrieveDataWithCredential:credential completion:^(FIRUser *_Nullable user, NSError *_Nullable error) { if (error) { // Handles error [self handleError:error]; return; } _user = user; }]; }];
ภาคผนวก: การใช้การลงชื่อเข้าใช้ด้วยโทรศัพท์โดยไม่มีการหมุน
Firebase Authentication ใช้การสุ่มเมธอดเพื่อรับแอปของคุณโดยอัตโนมัติ โทเค็น APN เพื่อจัดการข้อความ Push แบบไม่มีเสียงที่ Firebase ส่งไปให้ แอปของคุณโดยอัตโนมัติ และเพื่อสกัดกั้นการเปลี่ยนเส้นทางของรูปแบบที่กำหนดเองจาก หน้าการยืนยัน reCAPTCHA ระหว่างการยืนยัน
หากคุณไม่ต้องการใช้ Swirl คุณสามารถปิดใช้งานโดยการเพิ่ม Flag ได้
FirebaseAppDelegateProxyEnabled
ลงในไฟล์ Info.plist ของแอปและ
กำลังตั้งค่าเป็น NO
โปรดทราบว่าการตั้งค่าแฟล็กนี้เป็น NO
ยังปิดใช้ Swizzing ในผลิตภัณฑ์อื่นๆ ของ Firebase ซึ่งรวมถึง
Firebase Cloud Messaging
หากปิดใช้ Swizzing คุณต้องส่งโทเค็นอุปกรณ์ APNs อย่างชัดแจ้ง ข้อความ Push และ URL การเปลี่ยนเส้นทางชุดรูปแบบที่กำหนดเองไปยัง Firebase Authentication
หากคุณกำลังสร้างแอปพลิเคชัน SwiftUI คุณควรส่งผ่านโทเค็นอุปกรณ์ APNs อย่างชัดแจ้งด้วย ข้อความ Push และ URL การเปลี่ยนเส้นทางชุดรูปแบบที่กำหนดเองไปยัง Firebase Authentication
หากต้องการรับโทเค็นอุปกรณ์ APNs ให้ใช้
application(_:didRegisterForRemoteNotificationsWithDeviceToken:)
และในวิธีการนั้น ให้ส่งโทเค็นอุปกรณ์ไปยังAuth
setAPNSToken(_:type:)
วิธี
Swift
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { // Pass device token to auth Auth.auth().setAPNSToken(deviceToken, type: .unknown) // Further handling of the device token if needed by the app // ... }
Objective-C
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { // Pass device token to auth. [[FIRAuth auth] setAPNSToken:deviceToken type:FIRAuthAPNSTokenTypeProd]; // Further handling of the device token if needed by the app. }
ในการจัดการข้อความ Push ใน
application(_:didReceiveRemoteNotification:fetchCompletionHandler:):
ให้ตรวจสอบการแจ้งเตือนเกี่ยวกับการตรวจสอบสิทธิ์ Firebase โดยเรียกใช้
เมธอด canHandleNotification(_:)
ของ Auth
Swift
func application(_ application: UIApplication, didReceiveRemoteNotification notification: [AnyHashable : Any], fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { if Auth.auth().canHandleNotification(notification) { completionHandler(.noData) return } // This notification is not auth related; it should be handled separately. }
Objective-C
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)notification fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler { // Pass notification to auth and check if they can handle it. if ([[FIRAuth auth] canHandleNotification:notification]) { completionHandler(UIBackgroundFetchResultNoData); return; } // This notification is not auth related; it should be handled separately. }
ในการจัดการ URL การเปลี่ยนเส้นทางรูปแบบที่กำหนดเอง ให้ใช้
application(_:open:options:)
และในเมธอดดังกล่าว ให้ส่ง URL ไปยังของ Auth
canHandleURL(_:)
วิธี
Swift
func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool { if Auth.auth().canHandle(url) { return true } // URL not auth related; it should be handled separately. }
Objective-C
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options { if ([[FIRAuth auth] canHandleURL:url]) { return YES; } // URL not auth related; it should be handled separately. }
หากคุณใช้ SwiftUI หรือ UISceneDelegate
ในการจัดการ URL การเปลี่ยนเส้นทาง ให้ใช้
scene(_:openURLContexts:)
และในเมธอดดังกล่าว ให้ส่ง URL ไปยังของ Auth
canHandleURL(_:)
Swift
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { for urlContext in URLContexts { let url = urlContext.url _ = Auth.auth().canHandle(url) } // URL not auth related; it should be handled separately. }
Objective-C
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts { for (UIOpenURLContext *urlContext in URLContexts) { [FIRAuth.auth canHandleURL:urlContext.url]; // URL not auth related; it should be handled separately. } }
ขั้นตอนถัดไป
หลังจากผู้ใช้ลงชื่อเข้าใช้เป็นครั้งแรก ระบบจะสร้างบัญชีผู้ใช้ใหม่ และ ซึ่งก็คือชื่อผู้ใช้และรหัสผ่าน โทรศัพท์ หมายเลข หรือข้อมูลของผู้ให้บริการตรวจสอบสิทธิ์ ซึ่งก็คือผู้ใช้ที่ลงชื่อเข้าใช้ ใหม่นี้ จัดเก็บเป็นส่วนหนึ่งของโปรเจ็กต์ Firebase และสามารถใช้เพื่อระบุ ผู้ใช้สำหรับทุกแอปในโปรเจ็กต์ของคุณ ไม่ว่าผู้ใช้จะลงชื่อเข้าใช้ด้วยวิธีใดก็ตาม
-
ในแอป คุณสามารถดูข้อมูลโปรไฟล์พื้นฐานของผู้ใช้ได้จาก
User
โปรดดูหัวข้อจัดการผู้ใช้ ในFirebase Realtime DatabaseและCloud Storage กฎความปลอดภัย คุณสามารถทำสิ่งต่อไปนี้ รับรหัสผู้ใช้ที่ไม่ซ้ำของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร
auth
และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้เข้าถึงได้
คุณอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้แอปโดยใช้การตรวจสอบสิทธิ์หลายรายการได้ โดยลิงก์ข้อมูลเข้าสู่ระบบของผู้ให้บริการการตรวจสอบสิทธิ์กับ บัญชีผู้ใช้ที่มีอยู่เดิม
หากต้องการนำผู้ใช้ออกจากระบบ โปรดโทร
signOut:
Swift
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
Objective-C
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
คุณอาจต้องเพิ่มโค้ดการจัดการข้อผิดพลาดสำหรับการตรวจสอบสิทธิ์ทั้งหมดด้วย โปรดดูหัวข้อจัดการข้อผิดพลาด