Аутентификация с помощью номера телефона на платформах Apple с использованием Firebase

Вы можете использовать Firebase Authentication, чтобы войти в аккаунт пользователя, отправив SMS-сообщение на его телефон. Пользователь входит в аккаунт с помощью одноразового кода из SMS.

Самый простой способ добавить в приложение вход с помощью номера телефона – использовать FirebaseUI. Этот пакет содержит готовый виджет для входа, который реализует вход с помощью номера телефона, а также на основе пароля и федеративный вход. В этом документе рассказывается, как реализовать вход с номером телефона с помощью Firebase SDK.

Подготовка

  1. Если вы ещё не подключили приложение к проекту Firebase, сделайте это в консоли Firebase.
  2. Для установки зависимостей Firebase и управления ими используйте Swift Package Manager.

    1. Откройте проект приложения в Xcode и перейдите в меню File (Файл) > Add Packages (Добавить пакеты).
    2. Когда появится запрос, добавьте хранилище Firebase SDK для платформ Apple:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Выберите библиотеку Firebase Authentication.
    5. Добавьте флаг -ObjC в раздел Other Linker Flags (Другие флаги компоновщика) в настройках сборки целевого объекта.
    6. После этого Xcode автоматически начнет распознавать и скачивать зависимости в фоновом режиме.

Проблемы с безопасностью

Аутентификация только по номеру телефона, хотя и удобна, менее безопасна, чем другие доступные методы, поскольку номер телефона легко передать другому пользователю. Кроме того, на устройствах с поддержкой нескольких пользователей любой пользователь, который может получать SMS-сообщения, может войти в аккаунт, используя номер телефона устройства.

Если в вашем приложении для входа используется номер телефона, предложите пользователям более безопасные способы входа и расскажите о рисках, связанных с использованием номера телефона.

Как включить вход с помощью номера телефона в проекте Firebase

Чтобы пользователи могли входить в аккаунт с помощью SMS, сначала включите в проекте Firebase метод входа с номером телефона:

  1. В консоли Firebase выберите Безопасность > Аутентификация.
  2. На вкладке Sign-in method (Способ входа) включите поставщика для входа с помощью Phone (Телефона).
  3. Настройте правило для регионов, в которые вы хотите разрешить или запретить отправку SMS. Правило для региона SMS помогает защитить приложения от злоупотреблений с помощью SMS. Для новых проектов политика по умолчанию не разрешает использование регионов.
    1. В консоли Firebase выберите Безопасность > Аутентификация > вкладка Настройки.
    2. В разделе Правила в отношении регионов хранения данных для SMS настройте правила в отношении регионов хранения данных для 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:

  1. В Xcode включите push-уведомления для своего проекта.
  2. Загрузите ключ аутентификации APNs в Firebase. Если у вас ещё нет ключа аутентификации APNs, создайте его в Центре разработчиков Apple.

    1. В консоли Firebase выберите Настройки > Общие. Затем нажмите на вкладку Обмен сообщениями в облаке.
    2. В разделе Конфигурация приложения для iOS в поле Ключ аутентификации APNs нажмите Загрузить, чтобы загрузить ключ аутентификации для разработки, ключ аутентификации для производства или оба ключа. Обязательно заполните как минимум одно из этих полей.
    3. Перейдите к месту, где сохранен ключ, выберите его и нажмите Открыть. Добавьте идентификатор ключа (его можно найти в Центре участников Apple Developer) и нажмите Загрузить.

    Если у вас уже есть сертификат APNs, вы можете загрузить его.

  3. В Xcode включите функцию "Фоновые режимы" для своего проекта и установите флажки Фоновая выборка и Удаленные уведомления.

Как настроить проверку reCAPTCHA

Чтобы Firebase SDK мог использовать проверку reCAPTCHA:

  1. Добавьте в проект Xcode специальные схемы URL:
    1. Откройте конфигурацию проекта: дважды нажмите на название проекта в древовидном представлении слева. Выберите приложение в разделе ЦЕЛЕВЫЕ ПРИЛОЖЕНИЯ, откройте вкладку Информация и разверните раздел Типы URL.
    2. Нажмите кнопку + и добавьте зашифрованный идентификатор приложения в качестве схемы URL. Оставьте другие поля пустыми.

      Закодированный идентификатор приложения можно найти в консоли Firebase. Для этого перейдите на вкладку Настройки > Общие и прокрутите страницу вниз до раздела Ваши приложения, чтобы посмотреть сведения о приложении для iOS.

      После этого конфигурация должна выглядеть примерно так (но с вашими значениями):

      Скриншот интерфейса настройки специальной схемы URL в Xcode
  2. Необязательно. Если вы хотите настроить способ, которым приложение представляет SFSafariViewController при показе reCAPTCHA пользователю, создайте собственный класс, соответствующий протоколу AuthUIDelegate, и передайте его в verifyPhoneNumber(_:uiDelegate:completion:).

Отправить код подтверждения на телефон пользователя.

Чтобы начать вход с помощью номера телефона, предложите пользователю ввести номер и вызовите метод verifyPhoneNumber(_:uiDelegate:completion:), чтобы Firebase отправил код аутентификации на телефон пользователя по SMS:

  1. Получить номер телефона пользователя.

    Требования законодательства могут различаться, но мы рекомендуем сообщать пользователям, что при входе с помощью номера телефона они могут получить SMS с кодом подтверждения, за которое будет взиматься стандартная плата.

  2. Вызовите функцию 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";
  3. Сохраните идентификатор проверки и восстановите его при загрузке приложения. Это позволит вам сохранить действительный идентификатор проверки, если приложение будет закрыто до того, как пользователь завершит процесс входа (например, при переключении на приложение для обмена 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:.

  1. Получите код подтверждения от пользователя.
  2. Создайте объект FIRPhoneAuthCredential на основе кода подтверждения и идентификатора подтверждения.

    Swift

    let credential = PhoneAuthProvider.provider().credential(
      withVerificationID: verificationID,
      verificationCode: verificationCode
    )

    Objective-C

    FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider]
        credentialWithVerificationID:verificationID
                    verificationCode:userInput];
  3. Войдите в аккаунт пользователя с помощью объекта 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.
  • Проводить последовательные тесты с одним и тем же номером телефона без ограничений. Это снижает риск отклонения приложения при проверке в магазине, если проверяющий использует тот же номер телефона для тестирования.
  • Простое тестирование в средах разработки без дополнительных усилий, например возможность разрабатывать в симуляторе iOS или эмуляторе Android без сервисов Google Play.
  • Писать интеграционные тесты, не сталкиваясь с блокировками из-за проверок безопасности, которые обычно применяются к реальным номерам телефонов в рабочей среде.

Вымышленные номера телефонов должны соответствовать следующим требованиям:

  1. Убедитесь, что используемые номера телефонов вымышленные и не существуют в реальности. Firebase Authentication не позволяет использовать в качестве тестовых номеров существующие номера телефонов, которыми пользуются реальные пользователи. Один из вариантов – использовать в качестве тестовых номеров телефонов США номера с префиксом 555, например: +1 650-555-3434
  2. Номера телефонов должны иметь правильный формат, в том числе соответствовать требованиям к длине. Они проходят ту же проверку, что и номера реальных пользователей.
  3. Вы можете добавить до 10 номеров телефонов для разработки.
  4. Используйте сложные для подбора тестовые номера телефонов и коды и часто меняйте их.

Создание вымышленных номеров телефонов и кодов подтверждения

  1. В консоли Firebase выберите Безопасность > Аутентификация.
  2. На вкладке Способ входа включите поставщика услуг входа Телефон, если вы ещё этого не сделали.
  3. Разверните раздел Номера телефонов для тестирования.
  4. Укажите номер телефона, который хотите проверить, например:+1 650-555-3434.
  5. Введите шестизначный код подтверждения для этого номера, например: 654321.
  6. Нажмите Добавить для каждого номера. При необходимости вы можете удалить номер телефона и его код, наведя указатель на нужную строку и нажав на значок корзины.

Ручное тестирование

Вы можете сразу начать использовать вымышленный номер телефона в своем приложении. Это позволяет выполнять ручное тестирование на этапах разработки без проблем с квотами или регулированием скорости. Вы также можете проводить тестирование непосредственно в симуляторе 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 во время проверки.

Если вы не хотите использовать подмену, добавьте в файл Info.plist приложения флаг FirebaseAppDelegateProxyEnabled и задайте для него значение NO. Обратите внимание, что при установке этого флага в значение NO также отключается подмена для других продуктов Firebase, включая Firebase Cloud Messaging.

Если вы отключите swizzling, вам нужно будет явно передавать токен устройства APNs, push-уведомления и URL переадресации на специальную схему в Firebase Authentication.

Если вы создаете приложение на SwiftUI, вам также необходимо явно передать в Firebase Authentication токен устройства APNs, push-уведомления и URL переадресации на специальную схему.

Чтобы получить токен устройства 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&ltUIOpenURLContext&gt) {
  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&ltUIOpenURLContext *&gt *)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;
}

Также рекомендуем добавить код обработки ошибок для всех возможных ошибок аутентификации. Подробнее об обработке ошибок…