Вы можете использовать Firebase Authentication, чтобы выполнить вход пользователя, отправив SMS-сообщение на его телефон. Пользователь входит в аккаунт, используя одноразовый код из SMS.
Проще всего добавить в приложение вход по номеру телефона с помощью FirebaseUI. В нем есть виджет, который реализует вход по номеру телефона, паролю и федеративный вход. В этом документе описывается, как реализовать вход по номеру телефона с помощью Firebase SDK.
Подготовка
- Если вы ещё не подключили приложение к проекту Firebase, сделайте это в консоли Firebase.
-
Для установки зависимостей Firebase и управления ими используйте Swift Package Manager.
- Откройте проект приложения в Xcode и перейдите в меню File (Файл) > Add Packages (Добавить пакеты).
- Когда появится запрос, добавьте хранилище Firebase SDK для платформ Apple:
- Выберите библиотеку Firebase Authentication.
- Добавьте флаг
-ObjCв раздел Other Linker Flags (Другие флаги компоновщика) в настройках сборки целевого объекта. - После этого Xcode автоматически начнет распознавать и скачивать зависимости в фоновом режиме.
https://github.com/firebase/firebase-ios-sdk.git
Проблемы с безопасностью
Аутентификация только по номеру телефона удобна, но менее безопасна, чем другие доступные методы, поскольку номер телефона можно легко передать другому пользователю. Кроме того, на устройствах с несколькими профилями пользователей любой пользователь, который может получать SMS, может войти в аккаунт, используя номер телефона устройства.
Если в вашем приложении используется вход по номеру телефона, вы должны предлагать его наряду с более безопасными способами входа и информировать пользователей о компромиссах в отношении безопасности при использовании входа по номеру телефона.
Как включить вход по номеру телефона в проекте Firebase
Чтобы пользователи могли входить в аккаунт с помощью SMS, сначала включите способ входа по номеру телефона в проекте Firebase:
- В консоли Firebase выберите Безопасность > Аутентификация.
- На вкладке Sign-in method (Способ входа) включите поставщика входа Phone (Телефон).
-
Задайте правило для регионов, в которые вы хотите разрешить или запретить отправку SMS-сообщений. Настройка правил для регионов SMS помогает защитить приложения от злоупотреблений, связанных с SMS. Для новых проектов правило по умолчанию не разрешает регионы.
- В консоли Firebase выберите Безопасность > Аутентификация > вкладка Настройки.
- В разделе Правила в отношении регионов для SMS настройте правила.
Включить проверку приложений
Чтобы использовать аутентификацию по номеру телефона, Firebase должна иметь возможность подтвердить, что запросы на вход по номеру телефона поступают из вашего приложения. Firebase Authentication делает это двумя способами:
- Тихие уведомления APNs. Когда пользователь впервые входит в аккаунт на устройстве с помощью номера телефона, Firebase Authentication отправляет на устройство токен, используя тихое push-уведомление. Если приложение успешно получит уведомление от Firebase, вход по номеру телефона будет выполнен.
В iOS 8.0 и более поздних версиях для скрытых уведомлений не требуется явное согласие пользователя, поэтому на них не влияет отказ пользователя от получения уведомлений APNs в приложении. Таким образом, при реализации аутентификации по номеру телефона Firebase приложению не нужно запрашивать у пользователя разрешение на получение push-уведомлений.
- Проверка reCAPTCHA. Если отправить или получить скрытое push-уведомление невозможно (например, когда пользователь отключил фоновое обновление для вашего приложения или вы тестируете приложение в симуляторе iOS), Firebase Authentication использует проверку reCAPTCHA, чтобы завершить процесс входа по номеру телефона. Часто пользователю даже не нужно ничего решать, чтобы пройти проверку reCAPTCHA.
Если тихие push-уведомления настроены правильно, reCAPTCHA будет показываться лишь небольшому проценту пользователей. Тем не менее, вы должны убедиться, что вход по номеру телефона работает правильно, независимо от того, доступны ли тихие push-уведомления.
Начать получать беззвучные уведомления
Чтобы включить уведомления APNs для использования с Firebase Authentication:
- В Xcode включите push-уведомления для своего проекта.
-
Загрузите ключ аутентификации APNs в Firebase. Если у вас ещё нет ключа аутентификации APNs, создайте его в Apple Developer Member Center.
-
В консоли Firebase выберите
Settings (Настройки) > General (Общие). Затем откройте вкладку Cloud Messaging. - В разделе APNs authentication key (Ключ аутентификации APNs) в разделе iOS app configuration (Конфигурация приложения iOS) нажмите Upload (Загрузить), чтобы загрузить ключ аутентификации для разработки, ключ аутентификации для производства или оба ключа. Обязательно заполните как минимум одно из этих полей.
- Перейдите в папку, в которой сохранен ключ, выберите его и нажмите Открыть. Добавьте идентификатор ключа (его можно найти в Apple Developer Member Center) и нажмите Загрузить.
Если у вас уже есть сертификат APNs, вы можете загрузить его.
-
В консоли Firebase выберите
- В Xcode включите фоновые режимы для проекта и установите флажки Background fetch (Фоновое извлечение) и Remote notifications (Удаленные уведомления).
Как настроить проверку reCAPTCHA
Чтобы включить проверку reCAPTCHA в Firebase SDK, выполните следующие действия:
- Добавьте специальные схемы URL в проект Xcode:
- Откройте конфигурацию проекта, дважды нажав на его название в дереве слева. Выберите приложение в разделе TARGETS (Цели), откройте вкладку Info (Информация) и разверните раздел URL Types (Типы URL).
-
Нажмите кнопку + и добавьте закодированный идентификатор приложения в качестве схемы URL.
Другие поля оставьте пустыми.
Закодированный идентификатор приложения можно найти в консоли Firebase. Для этого перейдите в раздел
Settings (Настройки) > General (Общие) и прокрутите страницу вниз до раздела Your apps (Ваши приложения), чтобы посмотреть сведения о приложении для iOS.После этого конфигурация должна выглядеть примерно так (но со значениями, относящимися к вашему приложению):
- Необязательно. Если вы хотите настроить способ представления
SFSafariViewControllerв приложении при показе 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-сообщение, пока не истечет время ожидания исходного запроса.Когда вы вызываете
verifyPhoneNumber(_:uiDelegate:completion:), Firebase отправляет в приложение push-уведомление без звука или предлагает пользователю пройти проверку reCAPTCHA. После того как приложение получит уведомление или пользователь пройдет проверку reCAPTCHA, Firebase отправит SMS с кодом аутентификации на указанный номер телефона и передаст идентификатор подтверждения в функцию завершения. Для входа пользователя вам понадобятся и код подтверждения, и идентификатор подтверждения.SMS, отправленное Firebase, также можно локализовать, указав язык аутентификации в свойстве
languageCodeэкземпляра Auth.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: +1 650-555-3434.
- Номера телефонов должны быть правильно отформатированы с учетом длины и других ограничений. Они будут проходить ту же проверку, что и номера реальных пользователей.
- Для тестирования можно добавить до 10 номеров телефонов.
- Используйте тестовые номера телефонов и коды, которые сложно угадать, и часто меняйте их.
Создайте вымышленные номера телефонов и коды подтверждения.
- В консоли Firebase выберите Безопасность > Аутентификация.
- На вкладке Sign-in method (Способ входа) включите поставщика входа Phone (Телефон), если вы ещё этого не сделали.
- Разверните раздел Номера телефонов для тестирования.
-
Укажите номер телефона, который хотите проверить, например
+1 650-555-3434. -
Укажите шестизначный код подтверждения для этого номера, например
654321. - Нажмите Добавить для каждого номера. При необходимости вы можете удалить номер телефона и его код, наведя указатель мыши на соответствующую строку и нажав на значок корзины.
Ручное тестирование
Вы можете сразу начать использовать вымышленный номер телефона в своем приложении. Это позволяет выполнять ручное тестирование на этапах разработки, не сталкиваясь с проблемами квот или регулированием. Вы также можете проводить тестирование непосредственно в симуляторе iOS или эмуляторе Android без установленных сервисов Google Play.
Когда вы указываете вымышленный номер телефона и отправляете код подтверждения, SMS не отправляется. Вместо этого для входа в аккаунт нужно ввести ранее настроенный код подтверждения.
После входа в систему создается пользователь Firebase с этим номером телефона. Пользователь с таким номером имеет те же возможности и свойства, что и пользователь с реальным номером телефона, и может получать доступ к Realtime Database/Cloud Firestore и другим сервисам так же, как и он. Токен идентификатора, созданный в ходе этого процесса, имеет ту же подпись, что и у реального пользователя с номером телефона.
Если вы хотите дополнительно ограничить доступ, то можете назначить этим пользователям тестовую роль с помощью настраиваемых утверждений, чтобы отличать их от настоящих.
Тестирование интеграции
Помимо ручного тестирования, Firebase Authentication предоставляет API, которые помогают писать интеграционные тесты для проверки аутентификации по номеру телефона. Эти API отключают проверку приложений, отключая требование reCAPTCHA в веб-уведомлениях и push-уведомлениях без звука в iOS. Это позволяет проводить автоматизированное тестирование в таких процессах и упрощает его реализацию. Кроме того, они позволяют тестировать процессы мгновенной проверки на устройствах Android.
На устройствах iOS перед вызовом verifyPhoneNumber необходимо задать для параметра appVerificationDisabledForTesting значение TRUE. При этом не требуется токен APNs или отправка фоновых 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 let error = error { // Handles error self.handleError(error) return } let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID ?? "", verificationCode: testVerificationCode) Auth.auth().signIn(with: credential) { authResult, error in if let error = error { // Handles error self.handleError(error) return } _user = authResult.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 использует подмену метода, чтобы автоматически получать токен APNs вашего приложения, обрабатывать push-уведомления, которые Firebase отправляет в ваше приложение, и перехватывать перенаправление настраиваемой схемы со страницы проверки reCAPTCHA во время проверки.
Если вы не хотите использовать подмену методов, отключите ее, добавив флаг FirebaseAppDelegateProxyEnabled в файл Info.plist приложения и задав для него значение NO. Обратите внимание, что если установить для этого флага значение NO, то подмена методов будет отключена и для других продуктов Firebase, включая Firebase Cloud Messaging.
Если вы отключите подмену методов, вам потребуется явным образом передавать в Firebase Authentication токен устройства APNs, push-уведомления и URL перенаправления с собственной схемой.
Если вы создаете приложение SwiftUI, вам также необходимо явно передать токен устройства APNs, push-уведомления и URL перенаправления пользовательской схемы в Firebase Authentication.
Чтобы получить токен устройства APNs, реализуйте метод application(_:didRegisterForRemoteNotificationsWithDeviceToken:) и передайте в нем токен устройства методу setAPNSToken(_:type:) класса Auth.
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 методу canHandleURL(_:) класса Auth.
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 методу canHandleURL(_:) класса Auth.
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; }
Вы также можете добавить код обработки ошибок для всего диапазона ошибок аутентификации. Подробнее об обработке ошибок…