Google 致力于为黑人社区推动种族平等。查看具体举措
Эта страница переведена с помощью Cloud Translation API.
Switch to English

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

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

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

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

  1. Добавьте Firebase в свой проект iOS .
  2. Включите в свой Podfile следующие Podfile :
    pod 'Firebase/Auth'
    
  3. Если вы еще не подключили свое приложение к проекту Firebase, сделайте это из консоли Firebase .

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. В Xcode включите push-уведомления для своего проекта.
  2. Загрузите ключ аутентификации APN в Firebase. Если у вас еще нет ключа аутентификации APN, см. Раздел Настройка APN с помощью FCM .

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

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

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

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

Настроить верификацию reCAPTCHA

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

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

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

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

Отправьте проверочный код на телефон пользователя

Чтобы инициировать вход по номеру телефона, представьте пользователю интерфейс, предлагающий 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: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 объекта 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 параметра 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 использует переключение методов для автоматического получения токена APN вашего приложения, для обработки тихих push-уведомлений, которые Firebase отправляет вашему приложению, и для автоматического перехвата перенаправления настраиваемой схемы со страницы проверки reCAPTCHA во время проверки.

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

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

Чтобы получить токен устройства application:didRegisterForRemoteNotificationsWithDeviceToken: метод application:didRegisterForRemoteNotificationsWithDeviceToken: и в нем передайте токен устройства FIRAuth setAPNSToken:type: .

Быстрый

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, вызвав FIRAuth 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, developer should handle it.
}

Цель-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, developer should handle it.
}

Для обработки URL-адреса перенаправления настраиваемой схемы реализуйте метод application:openURL:sourceApplication:annotation: для устройств под управлением iOS 8 и старше и метод application:openURL:options: для устройств под управлением iOS 9 и новее, и в них передайте URL для FIRAuth «s canHandleURL методы.

Быстрый

// For iOS 9+
func application(_ application: UIApplication, open url: URL,
    options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
  if Auth.auth().canHandle(url) {
    return true
  }
  // URL not auth related, developer should handle it.
}

// For iOS 8-
func application(_ application: UIApplication,
                 open url: URL,
                 sourceApplication: String?,
                 annotation: Any) -> Bool {
  if Auth.auth().canHandle(url) {
    Return true
  }
  // URL not auth related, developer should handle it.
}

Цель-C

// For iOS 9+
- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
  if ([[FIRAuth auth] canHandleURL:url]) {
    return YES;
  }
  // URL not auth related, developer should handle it.
}

// For iOS 8-
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
  if ([[FIRAuth auth] canHandleURL:url]) {
    return YES;
  }
  // URL not auth related, developer should handle it.
}

Если вы используете SwiftUI или UISceneDelegate , для обработки URL-адреса перенаправления реализуйте метод scene:openURLContexts: и в них передайте URL-адрес в FIRAuth 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, developer should handle it.
}

Цель-C

- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
  for (UIOpenURLContext *urlContext in URLContexts) {
    [FIRAuth.auth canHandleURL:urlContext.url];
    // URL not auth related, developer should handle it.
  }
}

Следующие шаги

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

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

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

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