Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

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

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

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

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

Прежде чем вы начнете

Используйте Swift Package Manager для установки и управления зависимостями Firebase.

  1. В Xcode при открытом проекте приложения перейдите в File > Add Packages .
  2. При появлении запроса добавьте репозиторий SDK Firebase для платформ Apple:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. Выберите библиотеку аутентификации Firebase.
  5. Когда закончите, Xcode автоматически начнет разрешать и загружать ваши зависимости в фоновом режиме.
И проверьте шаг конфигурации:
  1. Если вы еще не подключили свое приложение к проекту Firebase, сделайте это из консоли Firebase .

Вопросы безопасности

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

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

Включите вход по номеру телефона для вашего проекта Firebase

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

  1. В консоли Firebase откройте раздел Аутентификация .
  2. На странице « Метод входа » включите метод входа « Номер телефона ».

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

Включить проверку приложений

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

  • Тихие уведомления APN : когда вы впервые входите в систему с номером телефона на устройстве, Firebase Authentication отправляет токен на устройство с помощью бесшумного push-уведомления. Если ваше приложение успешно получает уведомление от Firebase, можно продолжить вход по номеру телефона.

    Для iOS 8.0 и более поздних версий тихие уведомления не требуют явного согласия пользователя, и поэтому на них не влияет отказ пользователя от получения уведомлений APN в приложении. Таким образом, приложению не нужно запрашивать разрешение пользователя на получение push-уведомлений при реализации аутентификации по номеру телефона Firebase.

  • Проверка reCAPTCHA : в случае, если отправка или получение автоматического push-уведомления невозможна, например, когда пользователь отключил фоновое обновление для вашего приложения или при тестировании вашего приложения на симуляторе iOS, аутентификация Firebase использует проверку reCAPTCHA для завершения телефона. поток входа. Задача reCAPTCHA часто может быть выполнена без того, чтобы пользователю приходилось что-либо решать.

Когда тихие push-уведомления правильно настроены, только очень небольшой процент пользователей увидит поток reCAPTCHA. Тем не менее, вы должны убедиться, что вход по номеру телефона работает правильно, независимо от того, доступны ли автоматические push-уведомления.

Начать получать тихие уведомления

Чтобы включить уведомления APN для использования с аутентификацией Firebase:

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

    1. Внутри вашего проекта в консоли Firebase щелкните значок шестеренки, выберите «Настройки проекта» , а затем выберите вкладку « Облачные сообщения ».

    2. В разделе « Ключ аутентификации APNs » в разделе « Конфигурация приложения iOS » нажмите кнопку « Загрузить ».

    3. Перейдите к месту, где вы сохранили свой ключ, выберите его и нажмите « Открыть ». Добавьте идентификатор ключа для ключа (доступен в Apple Developer Member Center ) и нажмите « Загрузить ».

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

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

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

  1. Добавьте пользовательские схемы URL в свой проект Xcode:
    1. Откройте конфигурацию вашего проекта: дважды щелкните имя проекта в левом древовидном представлении. Выберите свое приложение в разделе ЦЕЛИ , затем перейдите на вкладку Информация и разверните раздел Типы URL .
    2. Нажмите кнопку + и добавьте схему URL-адресов для обратного идентификатора клиента. Чтобы найти это значение, откройте файл конфигурации GoogleService-Info.plist и найдите ключ REVERSED_CLIENT_ID . Скопируйте значение этого ключа и вставьте его в поле « Схемы URL » на странице конфигурации. Остальные поля оставьте пустыми.

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

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

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

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

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

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

  2. Вызовите 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 является реентерабельным: если вы вызываете его несколько раз, например, в методе onAppear представления, метод verifyPhoneNumber не будет отправлять второе SMS, если не истекло время ожидания исходного запроса.

    Когда вы вызываете verifyPhoneNumber(_:uiDelegate:completion:) , Firebase отправляет бесшумное push-уведомление вашему приложению или выдает пользователю вызов reCAPTCHA. После того, как ваше приложение получит уведомление или пользователь выполнит вызов reCAPTCHA, Firebase отправляет SMS-сообщение с кодом аутентификации на указанный номер телефона и передает идентификатор подтверждения вашей функции завершения. Вам потребуется как код подтверждения, так и идентификатор подтверждения, чтобы войти в систему пользователя.

    SMS-сообщение, отправленное Firebase, также можно локализовать, указав язык аутентификации через свойство languageCode в вашем экземпляре Auth.

    Быстрый

     // Change language code to french.
     Auth.auth().languageCode = "fr";
    

    Цель-C

     // Change language code to french.
     [FIRAuth auth].languageCode = @"fr";
    
  3. Сохраните идентификатор подтверждения и восстановите его при загрузке приложения. Таким образом, вы можете убедиться, что у вас все еще есть действительный идентификатор подтверждения, если ваше приложение будет закрыто до того, как пользователь завершит процесс входа (например, при переключении на приложение SMS).

    Вы можете сохранить идентификатор подтверждения любым удобным для вас способом. Простой способ — сохранить идентификатор проверки с помощью объекта 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 из кода подтверждения и идентификатора подтверждения и передав этот объект в signInWithCredential:completion: .

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

    Быстрый

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

    Цель-C

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

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

Вы можете напрямую начать использовать вымышленный номер телефона в своем приложении. Это позволяет выполнять ручное тестирование на этапах разработки, не сталкиваясь с проблемами квот или регулирования. Вы также можете протестировать непосредственно из симулятора iOS или эмулятора Android без установленных сервисов Google Play.

Когда вы указываете вымышленный номер телефона и отправляете код подтверждения, фактическое SMS не отправляется. Вместо этого вам необходимо предоставить ранее настроенный проверочный код, чтобы завершить вход.

По завершении входа создается пользователь Firebase с этим номером телефона. Пользователь имеет то же поведение и свойства, что и пользователь с реальным номером телефона, и может таким же образом получать доступ к базе данных реального времени/облаку Firestore и другим службам. Идентификационный токен, созданный в ходе этого процесса, имеет ту же подпись, что и реальный пользователь номера телефона.

Другой вариант — установить тестовую роль с помощью пользовательских утверждений для этих пользователей, чтобы отличить их от поддельных пользователей, если вы хотите еще больше ограничить доступ.

Интеграционное тестирование

В дополнение к ручному тестированию Firebase Authentication предоставляет API-интерфейсы, помогающие писать интеграционные тесты для тестирования аутентификации по телефону. Эти API отключают проверку приложений, отключая требование reCAPTCHA в Интернете и автоматические push-уведомления в iOS. Это делает возможным автоматическое тестирование в этих потоках и упрощает его реализацию. Кроме того, они помогают обеспечить возможность тестирования потоков мгновенной проверки на Android.

В iOS для параметра appVerificationDisabledForTesting необходимо установить значение TRUE перед вызовом verifyPhoneNumber . Это обрабатывается без запроса токена APN или отправки автоматических push-уведомлений в фоновом режиме, что упрощает тестирование в симуляторе. Это также отключает резервный поток 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;
    }];
}];

Приложение: Использование входа в систему с помощью телефона без swizzling

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

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

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

Чтобы получить токен устройства 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.
}

Чтобы обрабатывать push-уведомления, в application(_:didReceiveRemoteNotification:fetchCompletionHandler:): проверьте наличие уведомлений, связанных с аутентификацией Firebase, вызвав метод Auth canHandleNotification(_:) .

Быстрый

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-адрес методу Auth canHandleURL(_:) .

Быстрый

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-адрес методу Auth canHandleURL(_:) .

Быстрый

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 и может использоваться для идентификации пользователя во всех приложениях вашего проекта, независимо от того, как пользователь входит в систему.

  • В ваших приложениях вы можете получить основную информацию о профиле пользователя из объекта FIRUser . См. Управление пользователями .

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

Вы также можете добавить код обработки ошибок для всего диапазона ошибок аутентификации. См. Обработка ошибок .