คุณสามารถใช้ Firebase Authentication เพื่อลงชื่อเข้าใช้ผู้ใช้โดยส่งข้อความ SMS ไปยังโทรศัพท์ของผู้ใช้ ผู้ใช้ลงชื่อเข้าใช้ด้วยรหัสแบบใช้ครั้งเดียวที่อยู่ในข้อความ SMS
วิธีที่ง่ายที่สุดในการเพิ่มการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ลงในแอปของคุณคือการใช้ FirebaseUI ซึ่งมีวิดเจ็ตการลงชื่อเข้าใช้แบบดรอปอินที่ใช้ขั้นตอนการลงชื่อเข้าใช้สำหรับการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ ตลอดจนการลงชื่อเข้าใช้ด้วยรหัสผ่านและแบบรวมศูนย์ -ใน. เอกสารนี้อธิบายวิธีใช้ขั้นตอนการลงชื่อเข้าใช้หมายเลขโทรศัพท์โดยใช้ Firebase SDK
ก่อนที่คุณจะเริ่มต้น
ใช้ Swift Package Manager เพื่อติดตั้งและจัดการการอ้างอิง Firebase
- ใน Xcode เมื่อโปรเจ็กต์แอปของคุณเปิดอยู่ ให้ไปที่ File > Add Packages
- เมื่อได้รับแจ้ง ให้เพิ่มที่เก็บ Firebase Apple platforms SDK:
- เลือกไลบรารีการรับรองความถูกต้องของ Firebase
- เมื่อเสร็จแล้ว Xcode จะเริ่มแก้ไขและดาวน์โหลดการอ้างอิงของคุณโดยอัตโนมัติในเบื้องหลัง
https://github.com/firebase/firebase-ios-sdk
- หากคุณยังไม่ได้เชื่อมต่อแอปกับโปรเจ็กต์ Firebase ให้เชื่อมต่อจาก คอนโซล Firebase
ข้อกังวลด้านความปลอดภัย
การพิสูจน์ตัวตนโดยใช้เพียงหมายเลขโทรศัพท์นั้นสะดวก แต่มีความปลอดภัยน้อยกว่าวิธีอื่นๆ ที่มี เนื่องจากสามารถโอนหมายเลขโทรศัพท์ระหว่างผู้ใช้ได้อย่างง่ายดาย นอกจากนี้ บนอุปกรณ์ที่มีโปรไฟล์ผู้ใช้หลายโปรไฟล์ ผู้ใช้ที่สามารถรับข้อความ SMS ได้สามารถลงชื่อเข้าใช้บัญชีโดยใช้หมายเลขโทรศัพท์ของอุปกรณ์
หากคุณใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ในแอปของคุณ คุณควรนำเสนอควบคู่ไปกับวิธีการลงชื่อเข้าใช้ที่ปลอดภัยมากขึ้น และแจ้งให้ผู้ใช้ทราบถึงข้อเสียด้านความปลอดภัยของการใช้การลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์
เปิดใช้งานการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์สำหรับโครงการ Firebase ของคุณ
ในการลงชื่อเข้าใช้ผู้ใช้ด้วย SMS คุณต้องเปิดใช้งานวิธีการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์สำหรับโปรเจ็กต์ Firebase ของคุณก่อน:
- ใน คอนโซล Firebase ให้เปิดส่วน การรับรองความถูกต้อง
- ในหน้า วิธีการลงชื่อเข้า ใช้ ให้เปิดใช้งานวิธีการลงชื่อเข้าใช้ ด้วยหมายเลขโทรศัพท์
โควต้าคำขอลงชื่อเข้าใช้หมายเลขโทรศัพท์ของ Firebase สูงพอที่แอปส่วนใหญ่จะไม่ได้รับผลกระทบ อย่างไรก็ตาม หากคุณจำเป็นต้องลงชื่อเข้าใช้ผู้ใช้จำนวนมากด้วยการตรวจสอบสิทธิ์ทางโทรศัพท์ คุณอาจต้องอัปเกรดแผนราคาของคุณ ดูหน้า ราคา
เปิดใช้งานการยืนยันแอป
หากต้องการใช้การตรวจสอบสิทธิ์หมายเลขโทรศัพท์ Firebase จะต้องสามารถตรวจสอบได้ว่าคำขอลงชื่อเข้าใช้หมายเลขโทรศัพท์นั้นมาจากแอปของคุณ การรับรองความถูกต้องของ Firebase ทำได้สองวิธี:
- การแจ้งเตือน APN แบบเงียบ : เมื่อคุณลงชื่อเข้าใช้ผู้ใช้ด้วยหมายเลขโทรศัพท์เป็นครั้งแรกบนอุปกรณ์ การรับรองความถูกต้องของ Firebase จะส่งโทเค็นไปยังอุปกรณ์โดยใช้การแจ้งเตือนแบบเงียบ หากแอปของคุณได้รับการแจ้งเตือนจาก Firebase สำเร็จ การลงชื่อเข้าใช้หมายเลขโทรศัพท์จะดำเนินการต่อได้
สำหรับ iOS 8.0 และใหม่กว่า การแจ้งเตือนแบบเงียบไม่จำเป็นต้องได้รับความยินยอมจากผู้ใช้อย่างชัดแจ้ง ดังนั้นจึงไม่ได้รับผลกระทบจากผู้ใช้ที่ปฏิเสธที่จะรับการแจ้งเตือน APN ในแอป ดังนั้น แอปจึงไม่จำเป็นต้องขออนุญาตผู้ใช้เพื่อรับการแจ้งเตือนแบบพุชเมื่อใช้การตรวจสอบสิทธิ์หมายเลขโทรศัพท์ของ Firebase
- การยืนยัน reCAPTCHA : ในกรณีที่ไม่สามารถส่งหรือรับการแจ้งเตือนแบบเงียบได้ เช่น เมื่อผู้ใช้ปิดใช้งานการรีเฟรชพื้นหลังสำหรับแอปของคุณ หรือเมื่อทดสอบแอปของคุณบนเครื่องจำลอง iOS การตรวจสอบความถูกต้องของ Firebase จะใช้การยืนยัน reCAPTCHA เพื่อทำให้โทรศัพท์เสร็จสมบูรณ์ ขั้นตอนการลงชื่อเข้าใช้ ความท้าทายของ reCAPTCHA สามารถทำได้โดยที่ผู้ใช้ไม่ต้องแก้ไขอะไรเลย
เมื่อการแจ้งเตือนแบบพุชแบบเงียบได้รับการกำหนดค่าอย่างเหมาะสม จะมีผู้ใช้เพียงไม่กี่เปอร์เซ็นต์เท่านั้นที่จะได้สัมผัสโฟลว์ reCAPTCHA อย่างไรก็ตาม คุณควรตรวจสอบให้แน่ใจว่าการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ทำงานได้อย่างถูกต้อง ไม่ว่าจะมีการแจ้งเตือนแบบเงียบหรือไม่ก็ตาม
เริ่มรับการแจ้งเตือนแบบเงียบ
วิธีเปิดใช้งานการแจ้งเตือน APN สำหรับใช้กับ Firebase Authentication:
- ใน Xcode เปิดใช้งานการแจ้งเตือนแบบพุช สำหรับโครงการของคุณ
อัปโหลดคีย์การตรวจสอบสิทธิ์ APN ของคุณไปยัง Firebase หากคุณยังไม่มีคีย์การตรวจสอบสิทธิ์ APN โปรดสร้างคีย์ใน Apple Developer Member Center
ภายในโครงการของคุณในคอนโซล Firebase เลือกไอคอนรูปเฟือง เลือก การตั้งค่าโครงการ จากนั้นเลือกแท็บ Cloud Messaging
ใน คีย์การตรวจสอบสิทธิ์ APN ภายใต้ การกำหนดค่าแอป iOS ให้คลิกปุ่ม อัปโหลด
เรียกดูตำแหน่งที่คุณบันทึกคีย์ เลือก และคลิก เปิด เพิ่ม ID คีย์สำหรับคีย์ (มีให้ใน Apple Developer Member Center ) แล้วคลิก อัปโหลด
หากคุณมีใบรับรอง APN อยู่แล้ว คุณสามารถอัปโหลดใบรับรองแทนได้
ตั้งค่าการยืนยัน reCAPTCHA
วิธีเปิดใช้งาน Firebase SDK เพื่อใช้การยืนยัน reCAPTCHA:
- เพิ่มรูปแบบ URL ที่กำหนดเองในโครงการ Xcode ของคุณ:
- เปิดการกำหนดค่าโครงการของคุณ: ดับเบิลคลิกที่ชื่อโครงการในมุมมองแบบต้นไม้ด้านซ้าย เลือกแอปของคุณจากส่วน เป้าหมาย จากนั้นเลือกแท็บ ข้อมูล และขยายส่วน ประเภท URL
- คลิกปุ่ม + และเพิ่ม ID แอปที่เข้ารหัสเป็นรูปแบบ URL คุณสามารถค้นหา ID แอปที่เข้ารหัสของคุณได้ในหน้า การตั้งค่าทั่วไป ของคอนโซล Firebase ในส่วนสำหรับแอป iOS ของคุณ เว้นช่องอื่นๆ ว่างไว้
เมื่อเสร็จแล้ว การกำหนดค่าของคุณควรมีลักษณะดังนี้ (แต่มีค่าเฉพาะแอปพลิเคชันของคุณ):
- ทางเลือก : หากคุณต้องการปรับแต่งวิธีที่แอปของคุณนำเสนอ
SFSafariViewController
เมื่อแสดง reCAPTCHA แก่ผู้ใช้ ให้สร้างคลาสแบบกำหนดเองที่สอดคล้องกับโปรโตคอลAuthUIDelegate
และส่งไปที่verifyPhoneNumber(_:uiDelegate:completion:)
ส่งรหัสยืนยันไปยังโทรศัพท์ของผู้ใช้
หากต้องการเริ่มต้นการลงชื่อเข้าใช้ด้วยหมายเลขโทรศัพท์ ให้แสดงอินเทอร์เฟซที่แจ้งให้ผู้ใช้ระบุหมายเลขโทรศัพท์ จากนั้นโทรไปที่ verifyPhoneNumber(_:uiDelegate:completion:)
เพื่อขอให้ Firebase ส่งรหัสการตรวจสอบสิทธิ์ไปยังโทรศัพท์ของผู้ใช้ทาง SMS:
รับหมายเลขโทรศัพท์ของผู้ใช้
ข้อกำหนดทางกฎหมายแตกต่างกันไป แต่ตามแนวทางปฏิบัติที่ดีที่สุดและเพื่อกำหนดความคาดหวังสำหรับผู้ใช้ของคุณ คุณควรแจ้งให้ผู้ใช้ทราบว่าหากพวกเขาใช้การลงชื่อเข้าใช้ทางโทรศัพท์ พวกเขาอาจได้รับข้อความ SMS สำหรับการตรวจสอบและมีอัตรามาตรฐาน
- โทร
verifyPhoneNumber(_:uiDelegate:completion:)
ส่งผ่านหมายเลขโทรศัพท์ของผู้ใช้สวิฟต์
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 // ... }
วัตถุประสงค์-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
เป็น reentrant: หากคุณเรียกใช้เมธอดหลายครั้ง เช่น ในเมธอดonAppear
ของมุมมอง วิธีverifyPhoneNumber
จะไม่ส่ง SMS ครั้งที่สอง เว้นแต่คำขอดั้งเดิมจะหมดเวลาเมื่อคุณโทรไปที่
verifyPhoneNumber(_:uiDelegate:completion:)
Firebase จะส่งการแจ้งเตือนแบบเงียบไปยังแอปของคุณ หรือส่งคำขอ reCAPTCHA ให้กับผู้ใช้ หลังจากที่แอปของคุณได้รับการแจ้งเตือนหรือผู้ใช้ตอบคำถาม reCAPTCHA เสร็จแล้ว Firebase จะส่งข้อความ SMS ที่มีรหัสการตรวจสอบสิทธิ์ไปยังหมายเลขโทรศัพท์ที่ระบุ และส่ง ID การยืนยันไปยังฟังก์ชันการยืนยันตัวตนของคุณ คุณต้องใช้ทั้งรหัสยืนยันและรหัสยืนยันเพื่อลงชื่อเข้าใช้ผู้ใช้ข้อความ SMS ที่ส่งโดย Firebase สามารถแปลเป็นภาษาท้องถิ่นได้ด้วยการระบุภาษารับรองความถูกต้องผ่านคุณสมบัติ
languageCode
บนอินสแตนซ์การตรวจสอบสิทธิ์ของคุณสวิฟต์
// Change language code to french. Auth.auth().languageCode = "fr";
วัตถุประสงค์-C
// Change language code to french. [FIRAuth auth].languageCode = @"fr";
บันทึก ID การยืนยันและกู้คืนเมื่อแอปของคุณโหลด เมื่อทำเช่นนี้ คุณจะมั่นใจได้ว่าคุณยังมี ID ยืนยันที่ถูกต้อง หากแอปของคุณถูกยุติก่อนที่ผู้ใช้จะเสร็จสิ้นขั้นตอนการลงชื่อเข้าใช้ (เช่น ในขณะที่เปลี่ยนไปใช้แอป SMS)
คุณสามารถยืนยัน ID การตรวจสอบด้วยวิธีใดก็ได้ที่คุณต้องการ วิธีง่ายๆ คือการบันทึก ID การยืนยันด้วยวัตถุ
NSUserDefaults
:สวิฟต์
UserDefaults.standard.set(verificationID, forKey: "authVerificationID")
วัตถุประสงค์-C
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:verificationID forKey:@"authVerificationID"];
จากนั้น คุณสามารถเรียกคืนค่าที่บันทึกไว้ได้:
สวิฟต์
let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")
วัตถุประสงค์-C
NSString *verificationID = [defaults stringForKey:@"authVerificationID"];
หากการโทรเพื่อ verifyPhoneNumber(_:uiDelegate:completion:)
สำเร็จ คุณสามารถแจ้งให้ผู้ใช้พิมพ์รหัสยืนยันเมื่อได้รับในข้อความ SMS
ลงชื่อเข้าใช้ผู้ใช้ด้วยรหัสยืนยัน
หลังจากที่ผู้ใช้ให้รหัสยืนยันแก่แอปของคุณจากข้อความ SMS แล้ว ให้ลงชื่อเข้าใช้โดยสร้างวัตถุ FIRPhoneAuthCredential
จากรหัสยืนยันและ ID การตรวจสอบ และส่งวัตถุนั้นไปยัง signInWithCredential:completion:
- รับรหัสยืนยันจากผู้ใช้
- สร้างวัตถุ
FIRPhoneAuthCredential
จากรหัสการตรวจสอบและรหัสการตรวจสอบสวิฟต์
let credential = PhoneAuthProvider.provider().credential( withVerificationID: verificationID, verificationCode: verificationCode )
วัตถุประสงค์-C
FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID verificationCode:userInput];
- ลงชื่อเข้าใช้ผู้ใช้ด้วยวัตถุ
FIRPhoneAuthCredential
:สวิฟต์
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 // ... }
วัตถุประสงค์-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 ไม่อนุญาตให้คุณตั้งค่าหมายเลขโทรศัพท์ที่มีอยู่ซึ่งผู้ใช้จริงใช้เป็นหมายเลขทดสอบ ทางเลือกหนึ่งคือใช้หมายเลขนำหน้า 555 เป็นหมายเลขโทรศัพท์ทดสอบในสหรัฐอเมริกา เช่น +1 650-555-3434
- หมายเลขโทรศัพท์ต้องมีรูปแบบที่ถูกต้องสำหรับความยาวและข้อจำกัดอื่นๆ พวกเขาจะยังคงผ่านการตรวจสอบเช่นเดียวกับหมายเลขโทรศัพท์ของผู้ใช้จริง
- คุณสามารถเพิ่มหมายเลขโทรศัพท์ได้สูงสุด 10 หมายเลขสำหรับการพัฒนา
- ใช้หมายเลขโทรศัพท์/รหัสทดสอบที่คาดเดาได้ยากและเปลี่ยนบ่อยๆ
สร้างหมายเลขโทรศัพท์สมมติและรหัสยืนยัน
- ใน คอนโซล Firebase ให้เปิดส่วน การรับรองความถูกต้อง
- ในแท็บ วิธีการลงชื่อเข้า ใช้ ให้เปิดใช้งานผู้ให้บริการโทรศัพท์ หากคุณยังไม่ได้ดำเนินการ
- เปิด หมายเลขโทรศัพท์เพื่อทดสอบ เมนูหีบเพลง
- ระบุหมายเลขโทรศัพท์ที่คุณต้องการทดสอบ เช่น +1 650-555-3434
- ระบุรหัสยืนยัน 6 หลักสำหรับหมายเลขเฉพาะ เช่น 654321
- เพิ่ม หมายเลข หากจำเป็น คุณสามารถลบหมายเลขโทรศัพท์และรหัสได้โดยวางเมาส์เหนือแถวที่เกี่ยวข้องแล้วคลิกไอคอนถังขยะ
การทดสอบด้วยตนเอง
คุณสามารถเริ่มใช้หมายเลขโทรศัพท์สมมติในแอปพลิเคชันของคุณได้โดยตรง การดำเนินการนี้ทำให้คุณสามารถดำเนินการทดสอบด้วยตนเองในระหว่างขั้นตอนการพัฒนาโดยไม่เกิดปัญหาโควต้าหรือการควบคุมปริมาณ คุณยังสามารถทดสอบได้โดยตรงจากโปรแกรมจำลอง iOS หรือโปรแกรมจำลอง Android โดยไม่ต้องติดตั้งบริการ Google Play
เมื่อคุณระบุหมายเลขโทรศัพท์สมมติและส่งรหัสยืนยัน จะไม่มีการส่ง SMS จริง แต่คุณต้องระบุรหัสยืนยันที่กำหนดค่าไว้ก่อนหน้านี้เพื่อดำเนินการลงชื่อเข้าใช้ให้เสร็จสมบูรณ์
เมื่อลงชื่อเข้าใช้เสร็จสิ้น ระบบจะสร้างผู้ใช้ Firebase ด้วยหมายเลขโทรศัพท์นั้น ผู้ใช้มีลักษณะการทำงานและคุณสมบัติเหมือนกับผู้ใช้หมายเลขโทรศัพท์จริง และสามารถเข้าถึงฐานข้อมูลเรียลไทม์/Cloud Firestore และบริการอื่นๆ ได้ด้วยวิธีเดียวกัน โทเค็น ID ที่สร้างขึ้นในระหว่างกระบวนการนี้มีลายเซ็นเหมือนกับผู้ใช้หมายเลขโทรศัพท์จริง
อีกทางเลือกหนึ่งคือ การตั้งค่าบทบาททดสอบผ่านการอ้างสิทธิ์ที่กำหนดเอง สำหรับผู้ใช้เหล่านี้ เพื่อแยกความแตกต่างว่าเป็นผู้ใช้ปลอม หากคุณต้องการจำกัดการเข้าถึงเพิ่มเติม
การทดสอบการบูรณาการ
นอกจากการทดสอบด้วยตนเองแล้ว Firebase Authentication ยังมี API เพื่อช่วยเขียนการทดสอบการผสานรวมสำหรับการทดสอบการตรวจสอบสิทธิ์ทางโทรศัพท์ API เหล่านี้ปิดใช้งานการยืนยันแอปโดยปิดใช้งานข้อกำหนด reCAPTCHA ในเว็บและการแจ้งเตือนแบบเงียบใน iOS ทำให้การทดสอบระบบอัตโนมัติเป็นไปได้ในโฟลว์เหล่านี้และนำไปใช้งานได้ง่ายขึ้น นอกจากนี้ยังช่วยให้สามารถทดสอบขั้นตอนการยืนยันทันทีบน Android
บน iOS ต้องตั้งค่า appVerificationDisabledForTesting
เป็น TRUE
ก่อนเรียก verifyPhoneNumber
การดำเนินการนี้ดำเนินการโดยไม่ต้องใช้โทเค็น APN หรือส่งการแจ้งเตือนแบบเงียบในเบื้องหลัง ทำให้ง่ายต่อการทดสอบในโปรแกรมจำลอง การดำเนินการนี้จะปิดใช้โฟลว์สำรองของ reCAPTCHA
โปรดทราบว่าเมื่อปิดใช้งานการยืนยันแอป การใช้หมายเลขโทรศัพท์ที่ไม่ใช่เรื่องสมมติจะทำให้ลงชื่อเข้าใช้ไม่สำเร็จ เฉพาะหมายเลขโทรศัพท์ที่สมมติขึ้นเท่านั้นที่สามารถใช้ได้กับ API นี้
สวิฟต์
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 }]; }];
วัตถุประสงค์-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 ใช้วิธีการหมุนเพื่อรับโทเค็น APN ของแอปโดยอัตโนมัติ เพื่อจัดการการแจ้งเตือนแบบเงียบที่ Firebase ส่งไปยังแอปของคุณ และสกัดกั้นการเปลี่ยนเส้นทางโครงร่างที่กำหนดเองโดยอัตโนมัติจากหน้าการยืนยัน reCAPTCHA ระหว่างการยืนยัน
หากคุณไม่ต้องการใช้ swizzling คุณสามารถปิดใช้งานได้โดยเพิ่มแฟล็ก FirebaseAppDelegateProxyEnabled
ให้กับไฟล์ Info.plist ของแอปและตั้งค่าเป็น NO
โปรดทราบว่าการตั้งค่าแฟล็กนี้เป็น NO
ยังปิดใช้งานการหมุนวนสำหรับผลิตภัณฑ์ Firebase อื่นๆ รวมถึง Firebase Cloud Messaging
หากคุณปิดใช้งาน swizzling คุณต้องส่งโทเค็นอุปกรณ์ APN การแจ้งเตือนแบบพุช และ URL เปลี่ยนเส้นทางโครงร่างที่กำหนดเองไปยัง Firebase Authentication
หากคุณกำลังสร้างแอปพลิเคชัน SwiftUI คุณควรส่งโทเค็นอุปกรณ์ APN การแจ้งเตือนแบบพุช และ URL เปลี่ยนเส้นทางโครงร่างที่กำหนดเองไปยัง Firebase Authentication อย่างชัดเจน
ในการรับโทเค็นอุปกรณ์ APN ให้ใช้เมธอด application(_:didRegisterForRemoteNotificationsWithDeviceToken:)
และส่งผ่านโทเค็นอุปกรณ์ไปยัง setAPNSToken(_:type:)
ของ Auth
สวิฟต์
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { // Pass device token to auth Auth.auth().setAPNSToken(deviceToken, type: .prod) // Further handling of the device token if needed by the app // ... }
วัตถุประสงค์-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. }
ในการจัดการการแจ้งเตือนแบบพุช ใน application(_:didReceiveRemoteNotification:fetchCompletionHandler:):
เมธอด ให้ตรวจสอบการแจ้งเตือนที่เกี่ยวข้องกับการตรวจสอบสิทธิ์ของ Firebase โดยเรียกเมธอด canHandleNotification(_:)
ของ Auth
สวิฟต์
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. }
วัตถุประสงค์-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 ไปยัง canHandleURL(_:)
ของ Auth
สวิฟต์
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. }
วัตถุประสงค์-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 ไปยัง canHandleURL(_:)
ของ Auth
สวิฟต์
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. }
วัตถุประสงค์-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 คุณสามารถรับ ID ผู้ใช้ที่ไม่ซ้ำกันของผู้ใช้ที่ลงชื่อเข้าใช้จากตัวแปร
auth
และใช้เพื่อควบคุมข้อมูลที่ผู้ใช้สามารถเข้าถึงได้
คุณสามารถอนุญาตให้ผู้ใช้ลงชื่อเข้าใช้แอปของคุณโดยใช้ผู้ให้บริการตรวจสอบสิทธิ์หลายรายโดย เชื่อมโยงข้อมูลประจำตัวของผู้ให้บริการตรวจสอบสิทธิ์กับบัญชีผู้ใช้ที่มีอยู่
หากต้องการออกจากระบบผู้ใช้ ให้เรียก signOut:
สวิฟต์
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
วัตถุประสงค์-C
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
คุณอาจต้องการเพิ่มรหัสการจัดการข้อผิดพลาดสำหรับข้อผิดพลาดการตรวจสอบสิทธิ์ทั้งหมด ดู จัดการข้อผิดพลาด