Bạn có thể sử dụng Firebase Authentication để đăng nhập người dùng bằng cách gửi tin nhắn SMS đến điện thoại của người dùng. Người dùng đăng nhập bằng mã một lần có trong Tin nhắn SMS.
Cách dễ nhất để thêm thông tin đăng nhập bằng số điện thoại vào ứng dụng của bạn là sử dụng FirebaseUI, bao gồm một tiện ích đăng nhập giúp triển khai quy trình đăng nhập cho điện thoại đăng nhập bằng số cũng như đăng nhập liên kết và dựa trên mật khẩu. Tài liệu này mô tả cách triển khai quy trình đăng nhập bằng số điện thoại bằng Firebase SDK.
Trước khi bắt đầu
- Nếu bạn chưa kết nối ứng dụng của mình với dự án Firebase, hãy thực hiện từ bảng điều khiển Firebase.
-
Sử dụng Trình quản lý gói Swift để cài đặt và quản lý các phần phụ thuộc Firebase.
- Trong Xcode, khi dự án ứng dụng của bạn đang mở, hãy chuyển đến Tệp > Thêm gói.
- Khi được nhắc, hãy thêm kho lưu trữ SDK nền tảng Apple của Firebase:
- Chọn thư viện Firebase Authentication.
- Thêm cờ
-ObjC
vào mục Cờ trình liên kết khác trong chế độ cài đặt bản dựng của mục tiêu. - Khi hoàn tất, Xcode sẽ tự động bắt đầu phân giải và tải xuống các phần phụ thuộc trong nền.
https://github.com/firebase/firebase-ios-sdk.git
Các mối lo ngại về bảo mật
Xác thực chỉ dùng số điện thoại, mặc dù thuận tiện nhưng lại kém an toàn so với các phương thức hiện có khác, do sở hữu số điện thoại có thể dễ dàng chuyển giữa những người dùng. Ngoài ra, trên các thiết bị có nhiều người dùng hồ sơ, bất kỳ người dùng nào có thể nhận tin nhắn SMS đều có thể đăng nhập vào tài khoản bằng số điện thoại của thiết bị.
Nếu bạn sử dụng tính năng đăng nhập dựa trên số điện thoại trong ứng dụng của mình, bạn sẽ cung cấp tính năng này cùng với các phương thức đăng nhập an toàn hơn và thông báo cho người dùng về tính bảo mật đánh đổi khi sử dụng đăng nhập bằng số điện thoại.
Bật tính năng đăng nhập bằng số điện thoại cho dự án Firebase của bạn
Để đăng nhập người dùng bằng SMS, trước tiên bạn phải bật tính năng đăng nhập bằng số điện thoại cho dự án Firebase của bạn:
- Trong bảng điều khiển Firebase, hãy mở phần Xác thực.
- Trên trang Phương thức đăng nhập, bật Số điện thoại đăng nhập.
Bật tính năng xác minh ứng dụng
Để sử dụng phương thức xác thực số điện thoại, Firebase phải xác minh được rằng yêu cầu đăng nhập bằng số điện thoại đến từ ứng dụng của bạn. Có hai cách Firebase Authentication hoàn thành việc này:
- Thông báo APN im lặng: Khi bạn đăng nhập người dùng bằng
số điện thoại lần đầu trên thiết bị, Firebase Authentication sẽ gửi một
mã cho thiết bị bằng thông báo đẩy im lặng. Nếu ứng dụng của bạn
nhận thành công thông báo từ Firebase, số điện thoại
có thể tiếp tục đăng nhập.
Đối với iOS 8.0 trở lên, thông báo im lặng không yêu cầu thông báo rõ ràng sự đồng ý của người dùng và do đó không bị ảnh hưởng bởi việc người dùng từ chối nhận Thông báo APN trong ứng dụng. Do đó, ứng dụng không cần yêu cầu người dùng quyền nhận thông báo đẩy khi triển khai điện thoại Firebase xác thực số.
- xác minh reCAPTCHA: Trong trường hợp bạn gửi hoặc nhận sẽ không thể thực hiện được thông báo đẩy im lặng, chẳng hạn như khi người dùng bạn đã tắt chế độ làm mới trong nền cho ứng dụng hoặc khi thử nghiệm ứng dụng trên một Trình mô phỏng iOS, Firebase Authentication sử dụng phương thức xác minh reCAPTCHA để hoàn tất quy trình đăng nhập bằng điện thoại. Thử thách reCAPTCHA thường có thể được hoàn thành mà người dùng không phải giải quyết gì cả.
Khi thông báo đẩy im lặng được định cấu hình đúng cách, chỉ một thông báo rất nhỏ tỷ lệ phần trăm người dùng sẽ trải nghiệm quy trình reCAPTCHA. Tuy nhiên, bạn nên đảm bảo rằng quy trình đăng nhập bằng số điện thoại hoạt động chính xác bất kể bạn có bật chế độ đẩy thầm lặng hay không sẽ có thông báo.
Bắt đầu nhận thông báo im lặng
Cách bật thông báo APN để dùng với Firebase Authentication:
- Trong Xcode, bật thông báo đẩy cho dự án của bạn.
-
Tải khoá xác thực APN của bạn lên Firebase. Nếu chưa có khoá xác thực APN hãy nhớ tạo một khoá trong Trung tâm thành viên dành cho nhà phát triển của Apple.
-
Bên trong dự án của bạn trong bảng điều khiển Firebase, hãy chọn biểu tượng bánh răng, chọn Project Settings (Cài đặt dự án), sau đó chọn Thẻ Giải pháp gửi thông báo qua đám mây.
-
Trong khoá xác thực AAPN ở phần Cấu hình ứng dụng iOS, nhấp vào nút Tải lên .
-
Duyệt tới vị trí bạn đã lưu khoá của mình, chọn khoá đó rồi nhấp vào Mở. Thêm mã khoá cho khoá (có trong Trung tâm thành viên dành cho nhà phát triển của Apple) rồi nhấp vào Tải lên.
Nếu đã có chứng chỉ APN thì bạn có thể tải chứng chỉ lên thay thế.
-
- Trong Xcode, bật chế độ Chế độ nền cho dự án của bạn, sau đó chọn hộp đánh dấu cho chế độ Tìm nạp trong nền và Thông báo từ xa.
Thiết lập phương thức xác minh bằng reCAPTCHA
Cách bật Firebase SDK để sử dụng phương thức xác minh reCAPTCHA:
- Thêm giao thức URL tùy chỉnh vào dự án Xcode của bạn:
- Mở cấu hình dự án: nhấp đúp vào tên dự án trong chế độ xem dạng cây bên trái. Chọn ứng dụng của bạn trong mục MỤC TIÊU, sau đó chọn thẻ Thông tin rồi mở rộng mục Loại URL.
- Nhấp vào nút + rồi thêm Mã ứng dụng được mã hoá dưới dạng URL
hệ thống. Bạn có thể tìm thấy Mã ứng dụng được mã hoá trên
Chung
Trang Cài đặt của bảng điều khiển của Firebase, trong phần dành cho iOS
. Để trống các trường khác.
Sau khi hoàn tất, cấu hình của bạn sẽ có dạng như sau sau đây (nhưng với các giá trị dành riêng cho ứng dụng của bạn):
- Không bắt buộc: Nếu bạn muốn tuỳ chỉnh cách ứng dụng trình bày
SFSafariViewController
khi hiển thị reCAPTCHA cho người dùng, hãy tạo một ảnh động tuỳ chỉnh phù hợp với giao thứcAuthUIDelegate
và truyền nó đếnverifyPhoneNumber(_:uiDelegate:completion:)
.
Gửi mã xác minh đến điện thoại của người dùng
Để bắt đầu đăng nhập bằng số điện thoại, hãy hiển thị cho người dùng một giao diện nhắc
họ cần cung cấp số điện thoại, sau đó gọi
verifyPhoneNumber(_:uiDelegate:completion:)
để yêu cầu Firebase
gửi mã xác thực đến điện thoại của người dùng bằng SMS:
-
Lấy số điện thoại của người dùng.
Các yêu cầu pháp lý có thể khác nhau, nhưng đây là phương pháp hay nhất và để đặt kỳ vọng cho người dùng, bạn nên cho họ biết rằng nếu họ sử dụng đăng nhập bằng điện thoại, họ có thể nhận được tin nhắn SMS để xác minh và gửi có áp dụng cước phí.
- Gọi
verifyPhoneNumber(_:uiDelegate:completion:)
, truyền đến đó số điện thoại của người dùng.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 // ... }];
Phương thức
verifyPhoneNumber
là phương thức khởi tạo lại: nếu bạn gọi phương thức này nhiều lần, chẳng hạn như trong phương thứconAppear
của một khung hiển thị thì phương thứcverifyPhoneNumber
sẽ không gửi tin nhắn SMS thứ hai trừ phi đã hết thời gian chờ yêu cầu ban đầu.Khi bạn gọi
verifyPhoneNumber(_:uiDelegate:completion:)
, Firebase gửi thông báo đẩy dưới nền chương trình đến ứng dụng của bạn hoặc đưa ra Thử thách reCAPTCHA đối với người dùng. Sau khi ứng dụng của bạn nhận được thông báo hoặc người dùng hoàn thành thử thách reCAPTCHA, Firebase gửi tin nhắn SMS chứa mã xác thực tới số điện thoại cụ thể và chuyển mã xác minh để bạn hoàn tất . Bạn sẽ cần cả mã xác minh và mã xác minh Mã nhận dạng để đăng nhập người dùng.Bạn cũng có thể bản địa hoá tin nhắn SMS do Firebase gửi bằng cách chỉ định ngôn ngữ xác thực thông qua thuộc tính
languageCode
trên tính năng Xác thực của bạn thực thể.Swift
// Change language code to french. Auth.auth().languageCode = "fr";
Objective-C
// Change language code to french. [FIRAuth auth].languageCode = @"fr";
-
Lưu mã xác minh và khôi phục khi ứng dụng của bạn tải xong. Bằng cách làm như vậy, Bạn có thể đảm bảo rằng mình vẫn có mã xác minh hợp lệ nếu ứng dụng của bạn chấm dứt trước khi người dùng hoàn tất luồng đăng nhập (ví dụ: trong khi chuyển sang ứng dụng SMS).
Bạn có thể duy trì mã xác minh này theo bất kỳ cách nào bạn muốn. Một cách đơn giản là lưu mã xác minh với đối tượng
NSUserDefaults
:Swift
UserDefaults.standard.set(verificationID, forKey: "authVerificationID")
Objective-C
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:verificationID forKey:@"authVerificationID"];
Sau đó, bạn có thể khôi phục giá trị đã lưu:
Swift
let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")
Objective-C
NSString *verificationID = [defaults stringForKey:@"authVerificationID"];
Nếu lệnh gọi đến verifyPhoneNumber(_:uiDelegate:completion:)
thành công, bạn có thể nhắc người dùng nhập mã xác minh khi họ
nhận được mã xác minh qua tin nhắn SMS.
Đăng nhập người dùng bằng mã xác minh
Sau khi người dùng cung cấp cho ứng dụng của bạn mã xác minh từ SMS
hãy đăng nhập người dùng bằng cách tạo một FIRPhoneAuthCredential
đối tượng từ mã xác minh và mã xác minh rồi chuyển đối tượng đó
đến signInWithCredential:completion:
.
- Nhận mã xác minh từ người dùng.
- Tạo đối tượng
FIRPhoneAuthCredential
từ quy trình xác minh mã xác minh và mã xác minh.Swift
let credential = PhoneAuthProvider.provider().credential( withVerificationID: verificationID, verificationCode: verificationCode )
Objective-C
FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID verificationCode:userInput];
- Đăng nhập vào người dùng bằng đối tượng
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; // ... }];
Thử nghiệm bằng số điện thoại giả định
Bạn có thể thiết lập số điện thoại giả định để phát triển thông qua bảng điều khiển của Firebase. Kiểm thử bằng điện thoại hư cấu số mang lại các lợi ích sau:
- Kiểm tra việc xác thực số điện thoại mà không làm tiêu tốn hạn mức sử dụng.
- Kiểm tra xác thực số điện thoại mà không cần gửi tin nhắn SMS thực.
- Chạy các thử nghiệm liên tiếp cho cùng một số điện thoại mà không bị điều tiết. Chiến dịch này giảm thiểu nguy cơ bị từ chối trong quá trình xem xét trên Cửa hàng ứng dụng nếu nhân viên đánh giá sử dụng cùng một số điện thoại để thử nghiệm.
- Dễ dàng thử nghiệm trong các môi trường phát triển mà không cần làm gì thêm, chẳng hạn như khả năng phát triển trong trình mô phỏng iOS hoặc trình mô phỏng Android mà không cần Dịch vụ Google Play.
- Viết mã kiểm thử tích hợp mà không bị chặn bởi các quy trình kiểm tra bảo mật thường áp dụng số điện thoại thực trong môi trường sản xuất.
Số điện thoại hư cấu phải đáp ứng các yêu cầu sau:
- Đảm bảo bạn sử dụng số điện thoại thực sự là giả tưởng và chưa tồn tại. Firebase Authentication không cho phép bạn đặt số điện thoại hiện có mà người dùng thực sử dụng làm số thử nghiệm. Một lựa chọn là sử dụng số có tiền tố 555 làm số điện thoại thử nghiệm ở Hoa Kỳ, ví dụ: +1 650-555-3434
- Số điện thoại phải được định dạng chính xác về độ dài và hạn chế. Chúng vẫn sẽ được xác thực giống như số điện thoại của người dùng thực.
- Bạn có thể thêm tối đa 10 số điện thoại để phát triển.
- Sử dụng số điện thoại/mã thử nghiệm khó đoán và thay đổi được những thông tin đó thường xuyên.
Tạo số điện thoại giả và mã xác minh
- Trong bảng điều khiển Firebase, hãy mở Mục Xác thực.
- Trong thẻ Phương thức đăng nhập, hãy bật Nhà cung cấp dịch vụ điện thoại nếu bạn chưa bật.
- Mở trình đơn đàn phong cầm Số điện thoại để thử nghiệm.
- Cung cấp số điện thoại mà bạn muốn kiểm tra, ví dụ: +1 650-555-3434.
- Hãy cung cấp mã xác minh gồm 6 chữ số cho số điện thoại cụ thể đó, ví dụ: 654321.
- Thêm số điện thoại. Nếu cần thiết, bạn có thể xoá số điện thoại và mã bằng cách di chuột qua hàng tương ứng và nhấp vào biểu tượng thùng rác.
Kiểm thử theo cách thủ công
Bạn có thể trực tiếp bắt đầu sử dụng một số điện thoại hư cấu trong đơn đăng ký của mình. Điều này cho phép bạn thực hiện kiểm thử thủ công trong các giai đoạn phát triển mà không gặp phải vấn đề về hạn mức hoặc điều tiết. Bạn cũng có thể kiểm thử trực tiếp từ trình mô phỏng iOS hoặc trình mô phỏng Android mà không cần Dịch vụ Google Play .
Khi bạn cung cấp số điện thoại giả và gửi mã xác minh, không có tin nhắn SMS thực nào được cung cấp đã gửi. Thay vào đó, bạn cần cung cấp mã xác minh đã định cấu hình trước đó để hoàn tất việc ký tên trong năm
Khi hoàn tất đăng nhập, người dùng Firebase sẽ được tạo bằng số điện thoại đó. Chiến lược phát hành đĩa đơn người dùng có hành vi và thuộc tính giống như người dùng số điện thoại thực và có thể truy cập Realtime Database/Cloud Firestore và các dịch vụ khác theo cùng cách. Mã thông báo mã nhận dạng đã được tạo trong khoảng thời gian quy trình này có cùng chữ ký với người dùng số điện thoại thực.
Một lựa chọn khác là đặt vai trò thử nghiệm thông qua tuỳ chỉnh xác nhận quyền sở hữu đối với những người dùng này để phân biệt họ là người dùng giả mạo nếu bạn muốn hạn chế hơn nữa truy cập.
Kiểm thử tích hợp
Ngoài việc kiểm thử thủ công, Firebase Authentication còn cung cấp các API để giúp viết chương trình kiểm thử tích hợp để kiểm tra tính xác thực của điện thoại. Các API này vô hiệu hoá tính năng xác minh ứng dụng bằng cách tắt reCAPTCHA trong web và thông báo đẩy im lặng trong iOS. Điều này giúp thử nghiệm tự động hoá có thể các quy trình này và dễ triển khai hơn. Ngoài ra, chúng giúp khả năng thử nghiệm phiên bản tức thì quy trình xác minh trên Android.
Trên iOS, bạn phải đặt chế độ cài đặt appVerificationDisabledForTesting
thành
TRUE
trước khi gọi verifyPhoneNumber
. Việc này được xử lý mà không yêu cầu
mã thông báo APN bất kỳ hoặc gửi thông báo đẩy im lặng trong nền, giúp thử nghiệm dễ dàng hơn
trong trình mô phỏng. Thao tác này cũng vô hiệu hoá quy trình dự phòng reCAPTCHA.
Xin lưu ý rằng khi xác minh ứng dụng bị vô hiệu hóa, việc sử dụng số điện thoại không có thật sẽ không thể hoàn tất đăng nhập. Bạn chỉ có thể sử dụng các số điện thoại hư cấu với API này.
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; }]; }];
Phụ lục: Sử dụng phương thức đăng nhập trên điện thoại mà không nhấp nháy
Firebase Authentication sử dụng phương thức xoáy để tự động lấy Mã thông báo APN để xử lý các thông báo đẩy im lặng mà Firebase gửi đến ứng dụng của bạn và để tự động chặn lệnh chuyển hướng lược đồ tuỳ chỉnh từ trang xác minh reCAPTCHA trong quá trình xác minh.
Nếu không muốn sử dụng tính năng xoáy nhanh, bạn có thể tắt bằng cách thêm cờ
FirebaseAppDelegateProxyEnabled
vào tệp Info.plist của ứng dụng và
đặt thành NO
. Lưu ý rằng việc đặt cờ này thành NO
cũng vô hiệu hóa chuyển động nhanh cho các sản phẩm Firebase khác, bao gồm
Firebase Cloud Messaging
Nếu tắt tính năng xoáy nhanh, bạn phải truyền mã thiết bị APN một cách rõ ràng, thông báo đẩy và URL chuyển hướng lược đồ tuỳ chỉnh đến Firebase Authentication.
Nếu đang tạo ứng dụng SwiftUI, bạn cũng nên truyền mã thiết bị APN một cách rõ ràng, thông báo đẩy và URL chuyển hướng lược đồ tuỳ chỉnh đến Firebase Authentication.
Để lấy mã thông báo thiết bị APN, hãy triển khai
application(_:didRegisterForRemoteNotificationsWithDeviceToken:)
và trong đó, hãy truyền mã thông báo thiết bị đếnAuth
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. }
Để xử lý thông báo đẩy, trong
application(_:didReceiveRemoteNotification:fetchCompletionHandler:):
hãy kiểm tra các thông báo liên quan đến xác thực Firebase bằng cách gọi
Phương thức canHandleNotification(_:)
của 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. }
Để xử lý URL chuyển hướng lược đồ tuỳ chỉnh, hãy triển khai phương thức
application(_:open:options:)
và trong đó, hãy truyền URL đến phương thức của 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. }
Nếu bạn đang sử dụng SwiftUI hoặc UISceneDelegate
, để xử lý URL chuyển hướng, hãy triển khai phương thức
scene(_:openURLContexts:)
và trong đó, hãy chuyển URL đến hàm 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. } }
Các bước tiếp theo
Sau khi người dùng đăng nhập lần đầu tiên, một tài khoản người dùng mới sẽ được tạo và được liên kết với thông tin đăng nhập—tức là tên người dùng và mật khẩu, số điện thoại số hoặc thông tin của nhà cung cấp dịch vụ xác thực – người dùng đã đăng nhập. Thông tin mới này được lưu trữ như một phần của dự án Firebase và có thể được dùng để xác định một người dùng trên mọi ứng dụng trong dự án của bạn, bất kể người dùng đăng nhập bằng cách nào.
-
Trong ứng dụng của mình, bạn có thể lấy thông tin hồ sơ cơ bản của người dùng từ
User
. Xem phần Quản lý người dùng. Trong Firebase Realtime Database và Cloud Storage của bạn Quy tắc bảo mật, bạn có thể lấy mã nhận dạng người dùng duy nhất của người dùng đã đăng nhập từ biến
auth
, để kiểm soát loại dữ liệu mà người dùng có thể truy cập.
Bạn có thể cho phép người dùng đăng nhập vào ứng dụng của mình bằng nhiều phương thức xác thực bằng cách liên kết thông tin đăng nhập của nhà cung cấp dịch vụ xác thực với tài khoản người dùng hiện có.
Để đăng xuất một người dùng, hãy gọi
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; }
Bạn cũng nên thêm mã xử lý lỗi cho toàn bộ phạm vi xác thực . Hãy xem bài viết Xử lý lỗi.