Легко добавьте вход в свое приложение iOS с помощью FirebaseUI.

FirebaseUI — это библиотека, созданная на основе Firebase Authentication SDK, которая предоставляет встраиваемые потоки пользовательского интерфейса для использования в вашем приложении. FirebaseUI предоставляет следующие преимущества:

  • Несколько поставщиков : процессы входа в систему для электронной почты/пароля, ссылки на электронную почту, аутентификации по телефону, входа в Google, входа в Facebook и входа в Twitter.
  • Управление учетными записями : потоки для выполнения задач управления учетными записями, таких как создание учетной записи и сброс пароля.
  • Привязка анонимных учетных записей : потоки автоматического связывания анонимных учетных записей с поставщиками удостоверений.
  • Настраиваемый : настройте внешний вид FirebaseUI в соответствии с вашим приложением. Кроме того, поскольку FirebaseUI имеет открытый исходный код, вы можете разветвить проект и настроить его в соответствии со своими потребностями.

Прежде чем начать

  1. Добавьте Firebase в свой проект Apple .

  2. Добавьте FirebaseUI в свой подфайл:

    pod 'FirebaseUI'
    

    При желании вы можете добавить только компонент Auth и поставщиков, которых хотите использовать:

    pod 'FirebaseUI/Auth'
    
    pod 'FirebaseUI/Google'
    pod 'FirebaseUI/Facebook'
    pod 'FirebaseUI/OAuth' # Used for Sign in with Apple, Twitter, etc
    pod 'FirebaseUI/Phone'
    
  3. Если вы еще не подключили свое приложение к проекту Firebase, сделайте это из консоли Firebase .

Настройка способов входа

Прежде чем вы сможете использовать Firebase для входа пользователей, вы должны включить и настроить методы входа, которые вы хотите поддерживать.

Адрес электронной почты и пароль

В консоли Firebase откройте раздел «Аутентификация» и включите аутентификацию по электронной почте и паролю.

  1. В консоли Firebase откройте раздел Аутентификация . На вкладке «Метод входа» включите поставщика электронной почты и пароля . Обратите внимание, что для использования входа по ссылке электронной почты необходимо включить вход по электронной почте или паролю.

  2. В том же разделе включите метод входа по ссылке электронной почты (вход без пароля) и нажмите «Сохранить» .

  3. Вы можете включить вход по ссылке электронной почты, инициализировав экземпляр FUIEmailAuth с помощью FIREmailLinkAuthSignInMethod . Вам также потребуется предоставить действительный объект FIRActionCodeSettings с handleCodeInApp , установленным в значение true.

Быстрый

var actionCodeSettings = ActionCodeSettings()
actionCodeSettings.url = URL(string: "https://example.appspot.com")
actionCodeSettings.handleCodeInApp = true
actionCodeSettings.setAndroidPackageName("com.firebase.example", installIfNotAvailable: false, minimumVersion: "12")

let provider = FUIEmailAuth(authUI: FUIAuth.defaultAuthUI()!,
                            signInMethod: FIREmailLinkAuthSignInMethod,
                            forceSameDevice: false,
                            allowNewEmailAccounts: true,
                            actionCodeSetting: actionCodeSettings)

Цель-C

FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
actionCodeSettings.URL = [NSURL URLWithString:@"https://example.appspot.com"];
actionCodeSettings.handleCodeInApp = YES;
[actionCodeSettings setAndroidPackageName:@"com.firebase.example"
                    installIfNotAvailable:NO
                           minimumVersion:@"12"];

id<FUIAuthProvider> provider = [[FUIEmailAuth alloc] initWithAuthUI:[FUIAuth defaultAuthUI]
                                                       signInMethod:FIREmailLinkAuthSignInMethod
                                                    forceSameDevice:NO
                                              allowNewEmailAccounts:YES
                                                  actionCodeSetting:actionCodeSettings];
  1. Кроме того, вам необходимо внести в белый список URL-адрес, который вы передаете инициализатору. Вы можете сделать это в консоли Firebase , откройте раздел «Аутентификация» . На вкладке «Метод входа» добавьте URL-адрес в разделе «Авторизованные домены» .

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

Быстрый

FUIAuth.defaultAuthUI()!.handleOpen(url, sourceApplication: sourceApplication)

Цель-C

[[FUIAuth defaultAuthUI] handleOpenURL:url sourceApplication:sourceApplication];
  1. Вход по ссылке электронной почты в FirebaseUI-iOS совместим с FirebaseUI-Android и FirebaseUI-web, где один пользователь, запускающий поток из FirebaseUI-Android, может открыть ссылку и завершить вход в систему с помощью FirebaseUI-web. То же самое справедливо и для противоположного потока.

Яблоко

  1. Следуйте разделам «Перед началом работы» и «Соблюдение требований Apple к анонимным данным» в руководстве Firebase «Вход через Apple» .

  2. Добавьте возможность входа с помощью Apple в свой файл прав.

  3. Инициализируйте экземпляр поставщика OAuth, настроенный для входа с помощью Apple:

    Быстрый

    provider = FUIOAuth.appleAuthProvider()
    

    Цель-C

    FUIOAuth *provider = [FUIOAuth appleAuthProvider];
    

Google

  1. Настройте вход в Google, используя это руководство.

Фейсбук

  1. Настройте SDK входа в Facebook, перейдя на страницу начала работы Facebook .

  2. В консоли Firebase откройте раздел «Аутентификация» и включите Facebook. Чтобы включить вход в Facebook, вы должны предоставить свой идентификатор приложения Facebook и секрет приложения, которые вы можете получить в консоли разработчиков Facebook.

  3. Включите совместное использование связки ключей в своем проекте Xcode на экране «Настройки проекта» > «Возможности» .

  4. Добавьте fb FACEBOOK_APP_ID в качестве схемы URL-адресов в свой проект Xcode.

  5. Добавьте свой идентификатор приложения Facebook и отображаемое имя в файл Info.plist :

    Ключ Ценить
    FacebookAppID FACEBOOK_APP_ID (например, 1234567890 )
    FacebookDisplayName Название вашего приложения
  6. Инициализируйте экземпляр провайдера Facebook:

    Быстрый

    provider = FUIFacebookAuth(authUI: FUIAuth.defaultAuthUI())
    

    Цель-C

    FUIFacebookAuth *provider = [[FUIFacebookAuth alloc] initWithAuthUI:[FUIAuth defaultAuthUI]];
    

  7. Если вы хотите использовать Facebook Limited Login , установите свойство useLimitedLogin в экземпляре FUIFacebookAuth .

    Быстрый

    provider.useLimitedLogin = true
    

    Цель-C

    provider.useLimitedLogin = YES;
    

Твиттер

  1. В консоли Firebase откройте раздел «Аутентификация» и включите Twitter. Чтобы включить вход в Twitter, вы должны предоставить свой потребительский ключ и секрет API Twitter, которые вы можете получить в консоли управления приложениями Twitter.

  2. Инициализируйте экземпляр провайдера OAuth, настроенный для входа в Twitter:

    Быстрый

    provider = FUIOAuth.twitterAuthProvider()
    

    Цель-C

    FUIOAuth *provider = [FUIOAuth twitterAuthProvider];
    

Номер телефона

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

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

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

    1. В Xcode включите push-уведомления для вашего проекта.

    2. Загрузите ключ аутентификации APN в Firebase. Если у вас еще нет ключа аутентификации APN, обязательно создайте его в Центре участников Apple Developer .

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

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

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

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

  3. Когда уведомления APN не могут быть получены на устройстве, Firebase использует reCAPTCHA для проверки запросов.

    Чтобы включить проверку reCAPTCHA, выполните в Xcode следующее:

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

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

      Снимок экрана: интерфейс настройки пользовательской схемы URL-адресов Xcode.
  4. Необязательно : Firebase использует метод swizzling для автоматического получения токена APN вашего приложения, для обработки автоматических push-уведомлений, которые Firebase отправляет в ваше приложение, и для автоматического перехвата перенаправления пользовательской схемы со страницы проверки reCAPTCHA во время проверки.

    Если вы предпочитаете не использовать swizzling, см. Приложение: Использование входа в систему с помощью телефона без swizzling в документации по аутентификации Firebase SDK.

Войти

Чтобы начать процесс входа в FirebaseUI, сначала инициализируйте FirebaseUI:

Быстрый

import FirebaseAuthUI

/* ... */

FirebaseApp.configure()
let authUI = FUIAuth.defaultAuthUI()
// You need to adopt a FUIAuthDelegate protocol to receive callback
authUI.delegate = self

Цель-C

@import FirebaseAuthUI;

...

[FIRApp configure];
FUIAuth *authUI = [FUIAuth defaultAuthUI];
// You need to adopt a FUIAuthDelegate protocol to receive callback
authUI.delegate = self;

Затем настройте FirebaseUI для использования методов входа, которые вы хотите поддерживать:

Быстрый

import FirebaseAuthUI
import FirebaseFacebookAuthUI
import FirebaseGoogleAuthUI
import FirebaseOAuthUI
import FirebasePhoneAuthUI

let providers: [FUIAuthProvider] = [
  FUIGoogleAuth(),
  FUIFacebookAuth(),
  FUITwitterAuth(),
  FUIPhoneAuth(authUI:FUIAuth.defaultAuthUI()),
]
self.authUI.providers = providers

Цель-C

@import FirebaseAuthUI;
@import FirebaseFacebookAuthUI;
@import FirebaseGoogleAuthUI;
@import FirebaseOAuthUI;
@import FirebasePhoneAuthUI;

...

NSArray<id<FUIAuthProvider>> *providers = @[
  [[FUIGoogleAuth alloc] init],
  [[FUIFacebookAuth alloc] init],
  [[FUITwitterAuth alloc] init],
  [[FUIPhoneAuth alloc] initWithAuthUI:[FUIAuth defaultAuthUI]]
];
_authUI.providers = providers;

Если вы включили вход в Google или Facebook, реализуйте обработчик результатов потоков регистрации в Google и Facebook:

Быстрый

func application(_ app: UIApplication, open url: URL,
    options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
  let sourceApplication = options[UIApplicationOpenURLOptionsKey.sourceApplication] as! String?
  if FUIAuth.defaultAuthUI()?.handleOpen(url, sourceApplication: sourceApplication) ?? false {
    return true
  }
  // other URL handling goes here.
  return false
}

Цель-C

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary *)options {
  NSString *sourceApplication = options[UIApplicationOpenURLOptionsSourceApplicationKey];
  return [[FUIAuth defaultAuthUI] handleOpenURL:url sourceApplication:sourceApplication];
}

Наконец, получите экземпляр AuthViewController из FUIAuth . Затем вы можете либо представить его как первый контроллер представления вашего приложения, либо представить его из другого контроллера представления в вашем приложении.

Быстрый

Чтобы получить выбор метода входа:

let authViewController = authUI.authViewController()

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

let phoneProvider = FUIAuth.defaultAuthUI().providers.first as! FUIPhoneAuth
phoneProvider.signIn(withPresenting: currentlyVisibleController, phoneNumber: nil)

Цель-C

Чтобы получить выбор метода входа:

UINavigationController *authViewController = [authUI authViewController];

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

FUIPhoneAuth *phoneProvider = [FUIAuth defaultAuthUI].providers.firstObject;
[phoneProvider signInWithPresentingViewController:currentlyVisibleController phoneNumber:nil];

После того как вы представите представление аутентификации и пользователь войдет в систему, результат будет возвращен делегату FirebaseUI Auth в методе didSignInWithUser:error:

Быстрый

func authUI(_ authUI: FUIAuth, didSignInWith user: FIRUser?, error: Error?) {
  // handle user and error as necessary
}

Цель-C

   - (void)authUI:(FUIAuth *)authUI
didSignInWithUser:(nullable FIRUser *)user
            error:(nullable NSError *)error {
  // Implement this method to handle signed in user or error if any.
}

Выход

FirebaseUI предоставляет удобные методы выхода из системы аутентификации Firebase, а также всех поставщиков социальных удостоверений:

Быстрый

authUI.signOut()

Цель-C

[authUI signOut];

Кастомизация

Вы можете настроить экраны входа, создав подкласс контроллеров представления FirebaseUI и указав их в методах делегирования FUIAuth :

Быстрый

func authPickerViewController(forAuthUI authUI: FUIAuth) -> FUIAuthPickerViewController {
  return FUICustomAuthPickerViewController(nibName: "FUICustomAuthPickerViewController",
                                           bundle: Bundle.main,
                                           authUI: authUI)
}

func emailEntryViewController(forAuthUI authUI: FUIAuth) -> FUIEmailEntryViewController {
  return FUICustomEmailEntryViewController(nibName: "FUICustomEmailEntryViewController",
                                           bundle: Bundle.main,
                                           authUI: authUI)
}

func passwordRecoveryViewController(forAuthUI authUI: FUIAuth, email: String) -> FUIPasswordRecoveryViewController {
  return FUICustomPasswordRecoveryViewController(nibName: "FUICustomPasswordRecoveryViewController",
                                                 bundle: Bundle.main,
                                                 authUI: authUI,
                                                 email: email)
}

func passwordSignInViewController(forAuthUI authUI: FUIAuth, email: String) -> FUIPasswordSignInViewController {
  return FUICustomPasswordSignInViewController(nibName: "FUICustomPasswordSignInViewController",
                                               bundle: Bundle.main,
                                               authUI: authUI,
                                               email: email)
}

func passwordSignUpViewController(forAuthUI authUI: FUIAuth, email: String) -> FUIPasswordSignUpViewController {
  return FUICustomPasswordSignUpViewController(nibName: "FUICustomPasswordSignUpViewController",
                                               bundle: Bundle.main,
                                               authUI: authUI,
                                               email: email)
}

func passwordVerificationViewController(forAuthUI authUI: FUIAuth, email: String, newCredential: AuthCredential) -> FUIPasswordVerificationViewController {
  return FUICustomPasswordVerificationViewController(nibName: "FUICustomPasswordVerificationViewController",
                                                     bundle: Bundle.main,
                                                     authUI: authUI,
                                                     email: email,
                                                     newCredential: newCredential)
}

Цель-C

- (FUIAuthPickerViewController *)authPickerViewControllerForAuthUI:(FUIAuth *)authUI {
  return [[FUICustomAuthPickerViewController alloc] initWithNibName:@"FUICustomAuthPickerViewController"
                                                             bundle:[NSBundle mainBundle]
                                                             authUI:authUI];
}

- (FUIEmailEntryViewController *)emailEntryViewControllerForAuthUI:(FUIAuth *)authUI {
  return [[FUICustomEmailEntryViewController alloc] initWithNibName:@"FUICustomEmailEntryViewController"
                                                             bundle:[NSBundle mainBundle]
                                                             authUI:authUI];

}

- (FUIPasswordSignInViewController *)passwordSignInViewControllerForAuthUI:(FUIAuth *)authUI
                                                                     email:(NSString *)email {
  return [[FUICustomPasswordSignInViewController alloc] initWithNibName:@"FUICustomPasswordSignInViewController"
                                                                 bundle:[NSBundle mainBundle]
                                                                 authUI:authUI
                                                                  email:email];

}

- (FUIPasswordSignUpViewController *)passwordSignUpViewControllerForAuthUI:(FUIAuth *)authUI
                                                                     email:(NSString *)email {
  return [[FUICustomPasswordSignUpViewController alloc] initWithNibName:@"FUICustomPasswordSignUpViewController"
                                                                 bundle:[NSBundle mainBundle]
                                                                 authUI:authUI
                                                                  email:email];

}

- (FUIPasswordRecoveryViewController *)passwordRecoveryViewControllerForAuthUI:(FUIAuth *)authUI
                                                                         email:(NSString *)email {
  return [[FUICustomPasswordRecoveryViewController alloc] initWithNibName:@"FUICustomPasswordRecoveryViewController"
                                                                   bundle:[NSBundle mainBundle]
                                                                   authUI:authUI
                                                                    email:email];

}

- (FUIPasswordVerificationViewController *)passwordVerificationViewControllerForAuthUI:(FUIAuth *)authUI
                                                                                 email:(NSString *)email
                                                                         newCredential:(FIRAuthCredential *)newCredential {
  return [[FUICustomPasswordVerificationViewController alloc] initWithNibName:@"FUICustomPasswordVerificationViewController"
                                                                       bundle:[NSBundle mainBundle]
                                                                       authUI:authUI
                                                                        email:email
                                                                newCredential:newCredential];
}

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

Быстрый

let kFirebaseTermsOfService = URL(string: "https://example.com/terms")!
authUI.tosurl = kFirebaseTermsOfService

Цель-C

authUI.TOSURL = [NSURL URLWithString:@"https://example.com/terms"];

Наконец, вы можете настроить сообщения и подсказки, отображаемые вашим пользователям, указав собственный пакет:

Быстрый

authUI.customStringsBundle = NSBundle.mainBundle() // Or any custom bundle.

Цель-C

authUI.customStringsBundle = [NSBundle mainBundle]; // Or any custom bundle.

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

  • Дополнительную информацию об использовании и настройке FirebaseUI см. в файле README на GitHub.
  • Если вы обнаружили проблему в FirebaseUI и хотите сообщить об этом, воспользуйтесь трекером проблем GitHub .