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

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

Подготовка

  1. Создайте проект Firebase и зарегистрируйте приложение, если вы этого ещё не сделали.
  2. Для установки зависимостей Firebase и управления ими используйте Swift Package Manager.

    1. Откройте проект приложения в Xcode и перейдите в меню File (Файл) > Add Packages (Добавить пакеты).
    2. Когда появится запрос, добавьте хранилище Firebase SDK для платформ Apple:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Выберите библиотеку Firebase Authentication.
    5. Добавьте флаг -ObjC в раздел Other Linker Flags (Другие флаги компоновщика) в настройках сборки целевого объекта.
    6. После этого Xcode автоматически начнет распознавать и скачивать зависимости в фоновом режиме.
  3. Получите ключи сервера проекта:
    1. В консоли Firebase перейдите на вкладку Настройки > Сервисные аккаунты.
    2. Внизу раздела Firebase Admin SDK нажмите Создать новый закрытый ключ.
    3. Пара открытого и закрытого ключей нового сервисного аккаунта автоматически сохранится на вашем компьютере. Скопируйте этот файл на сервер аутентификации.

Как пройти аутентификацию с помощью Firebase

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

    SwiftUI

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

    Swift

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

    Swift

    // 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. Получив специальный токен от сервера аутентификации, передайте его в signInWithCustomToken, чтобы войти в аккаунт пользователя:

    Swift

    Auth.auth().signIn(withCustomToken: customToken ?? "") { user, error in
      // ...
    }

    Objective-C

    [[FIRAuth auth] signInWithCustomToken:customToken
                               completion:^(FIRAuthDataResult * _Nullable authResult,
                                            NSError * _Nullable error) {
      // ...
    }];

Дальнейшие действия

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

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

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

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

Чтобы выйти из аккаунта пользователя, вызовите функцию signOut:.

Swift

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

Также рекомендуем добавить код обработки ошибок для всех возможных ошибок аутентификации. Подробнее об обработке ошибок…