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

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

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

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

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

  2. Добавьте FirebaseUI в свой Podfile:

    pod 'FirebaseUI'
    

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

    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.firebasestorage.app")
    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)
    

    Objective-C

    FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
    actionCodeSettings.URL = [NSURL URLWithString:@"https://example.firebasestorage.app"];
    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];
    
  4. Кроме того, необходимо добавить URL-адрес, передаваемый инициализатору, в белый список. Это можно сделать в консоли Firebase , открыв раздел «Аутентификация» . На вкладке «Метод входа» добавьте URL-адрес в раздел «Авторизованные домены» .

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

    Быстрый

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

    Objective-C

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

Яблоко

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

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

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

    Быстрый

    provider = FUIOAuth.appleAuthProvider()

    Objective-C

    FUIOAuth *provider = [FUIOAuth appleAuthProvider];

Google

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

Фейсбук

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

  2. В консоли Firebase откройте раздел «Аутентификация» и включите Facebook. Для включения входа через Facebook необходимо указать свой идентификатор приложения Facebook (App ID) и секретный ключ приложения (App Secret), которые можно получить в консоли разработчиков 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())

    Objective-C

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

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

    Быстрый

    provider.useLimitedLogin = true

    Objective-C

    provider.useLimitedLogin = YES;

Твиттер

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

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

    Быстрый

    provider = FUIOAuth.twitterAuthProvider()

    Objective-C

    FUIOAuth *provider = [FUIOAuth twitterAuthProvider];

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

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

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

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

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

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

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

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

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

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

  3. Если на устройстве не удается получить уведомления APNs, Firebase использует reCAPTCHA для проверки запросов.

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

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

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

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

    Если вы предпочитаете не использовать подмену паролей (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

Objective-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

Objective-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, реализуйте обработчик результатов этих процессов:

Быстрый

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
}

Objective-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)

Objective-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
}

Objective-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 Authentication, а также из всех социальных систем идентификации:

Быстрый

authUI.signOut()

Objective-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)
}

Objective-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

Objective-C

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

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

Быстрый

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

Objective-C

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

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

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