Как выполнять аутентификацию с помощью 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 перейдите на вкладку Settings (Настройки) > Service accounts (Сервисные аккаунты).
    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;
}

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