Аутентификация в Firebase с использованием учетных записей на основе пароля на платформах Apple.

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

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

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

  1. В Xcode откройте проект приложения и перейдите в Файл > Добавить пакеты .
  2. При появлении запроса добавьте репозиторий Firebase Apple Platforms SDK:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Выберите библиотеку Firebase Authentication .
  5. Добавьте флаг -ObjC в раздел «Другие флаги компоновщика» настроек сборки вашей целевой системы.
  6. После завершения Xcode автоматически начнет разрешать и загружать ваши зависимости в фоновом режиме.

Далее выполните некоторые шаги по настройке:

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

Создайте учетную запись с паролем

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

  1. Импортируйте модуль FirebaseCore в UIApplicationDelegate , а также любые другие модули Firebase, используемые вашим делегатом приложения. Например, чтобы использовать Cloud Firestore и Authentication :

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Быстрый

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  2. Настройте общий экземпляр FirebaseApp в методе application(_:didFinishLaunchingWithOptions:) делегата вашего приложения:

    SwiftUI

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Быстрый

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  3. Если вы используете SwiftUI, необходимо создать делегат приложения и прикрепить его к структуре App через UIApplicationDelegateAdaptor или NSApplicationDelegateAdaptor . Также необходимо отключить подмену делегата приложения. Подробнее см. в инструкциях по SwiftUI .

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          
  4. Когда новый пользователь регистрируется с помощью формы регистрации вашего приложения, выполните все необходимые действия по проверке новой учетной записи, требуемые вашим приложением, например, проверьте, что пароль новой учетной записи введен правильно и соответствует вашим требованиям к сложности.
  5. Создайте новую учетную запись, передав адрес электронной почты и пароль нового пользователя в createUser .

    Быстрый

    Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
      // ...
    }

    Objective-C

    [[FIRAuth auth] createUserWithEmail:email
                               password:password
                             completion:^(FIRAuthDataResult * _Nullable authResult,
                                          NSError * _Nullable error) {
      // ...
    }];
    Если новая учетная запись была успешно создана, пользователь вошел в систему, и вы можете получить данные учетной записи пользователя из объекта результата, который передается в метод обратного вызова.

Авторизуйтесь как пользователь, используя адрес электронной почты и пароль.

Действия для входа пользователя с паролем аналогичны действиям по созданию новой учётной записи. В разделе входа в приложение выполните следующие действия:

  1. Импортируйте модуль FirebaseCore в UIApplicationDelegate , а также любые другие модули Firebase, используемые вашим делегатом приложения. Например, чтобы использовать Cloud Firestore и Authentication :

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Быстрый

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  2. Настройте общий экземпляр FirebaseApp в методе application(_:didFinishLaunchingWithOptions:) делегата вашего приложения:

    SwiftUI

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Быстрый

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  3. Если вы используете SwiftUI, необходимо создать делегат приложения и прикрепить его к структуре App через UIApplicationDelegateAdaptor или NSApplicationDelegateAdaptor . Также необходимо отключить подмену делегата приложения. Подробнее см. в инструкциях по SwiftUI .

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          
  4. Когда пользователь входит в ваше приложение, передайте его адрес электронной почты и пароль для signIn .

    Быстрый

    Auth.auth().signIn(withEmail: email, password: password) { [weak self] authResult, error in
      guard let strongSelf = self else { return }
      // ...
    }

    Objective-C

    [[FIRAuth auth] signInWithEmail:self->_emailField.text
                           password:self->_passwordField.text
                         completion:^(FIRAuthDataResult * _Nullable authResult,
                                      NSError * _Nullable error) {
      // ...
    }];
    Если пользователь успешно выполнил вход в систему, вы можете получить данные его учетной записи из объекта результата, который передается в метод обратного вызова.

Рекомендуется: установить политику паролей

Вы можете повысить безопасность учетной записи, установив требования к сложности пароля.

Чтобы настроить политику паролей для вашего проекта, откройте вкладку «Политика паролей» на странице «Параметры аутентификации» консоли Firebase :

Настройки аутентификации

Политики паролей Firebase Authentication поддерживают следующие требования к паролям:

  • Требуется строчная буква

  • Требуется заглавный символ

  • Требуется числовой символ

  • Требуется небуквенно-цифровой символ

    Следующие символы удовлетворяют требованию не быть буквенно-цифровыми: ^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~

  • Минимальная длина пароля (от 6 до 30 символов; по умолчанию — 6)

  • Максимальная длина пароля (максимальная длина 4096 символов)

Вы можете включить принудительное применение политики паролей в двух режимах:

  • Требовать : попытки зарегистрироваться будут безуспешными до тех пор, пока пользователь не обновит пароль, соответствующий вашей политике.

  • Уведомление : пользователям разрешено регистрироваться с несоответствующим паролем. При использовании этого режима необходимо проверить пароль пользователя на стороне клиента на соответствие политике и каким-либо образом предложить пользователю обновить пароль, если он не соответствует.

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

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

Рекомендуется: включить защиту от перечисления адресов электронной почты

Некоторые методы Firebase Authentication , принимающие адреса электронной почты в качестве параметров, вызывают определённые ошибки, если адрес электронной почты не зарегистрирован, хотя он должен быть зарегистрирован (например, при входе с адресом электронной почты и паролем), или зарегистрирован, хотя он не должен использоваться (например, при изменении адреса электронной почты пользователя). Хотя это может быть полезно для предложения пользователям конкретных мер по устранению проблем, злоумышленники также могут использовать это для получения адресов электронной почты, зарегистрированных вашими пользователями.

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

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

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

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

  • В правилах безопасности Firebase Realtime Database и Cloud Storage вы можете получить уникальный идентификатор вошедшего в систему пользователя из переменной auth и использовать его для управления данными, к которым пользователь может получить доступ.

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

Чтобы выйти из системы пользователя, вызовите signOut:

Быстрый

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

Objective-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

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