Анонимная аутентификация с помощью Firebase на платформах Apple

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

Подготовка

  1. Для установки зависимостей 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 автоматически начнет распознавать и скачивать зависимости в фоновом режиме.
  2. Если вы ещё не подключили приложение к проекту Firebase, сделайте это в консоли Firebase.
  3. Включите анонимную аутентификацию:
    1. В консоли Firebase выберите Безопасность > Аутентификация.
    2. На вкладке Sign-in method (Способ входа) включите поставщика Anonymous (Анонимный).
    3. Необязательно. Если вы обновили проект до Firebase Authentication with Identity Platform, то можете включить автоматическую очистку. Если вы включите этот параметр, анонимные аккаунты, созданные более 30 дней назад, будут автоматически удалены. В проектах с включенной автоматической очисткой анонимная аутентификация больше не будет учитываться в лимитах на использование или квотах на оплату. Подробнее об автоматической очистке…

Анонимная аутентификация с помощью Firebase

Если пользователь, не выполнивший вход, использует функцию приложения, для которой требуется аутентификация с помощью 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. Вызовите метод signInAnonymouslyWithCompletion::

    Swift

    Auth.auth().signInAnonymously { authResult, error in
      // ...
    }

    Objective-C

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

    Swift

    guard let user = authResult?.user else { return }
    let isAnonymous = user.isAnonymous  // true
    let uid = user.uid

    Objective-C

    FIRUser *user = authResult.user;
    BOOL isAnonymous = user.anonymous;  // YES
    NSString *uid = user.uid;

Как преобразовать анонимный аккаунт в постоянный

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

  1. Когда пользователь регистрируется, выполните процедуру входа для поставщика аутентификации пользователя, но не вызывайте методы FIRAuth.signInWith. Например, получите токен идентификатора Google, токен доступа Facebook или адрес электронной почты и пароль пользователя.
  2. Получите FIRAuthCredential для нового поставщика услуг аутентификации:

    вход с аккаунтом Google
    Swift
    guard
      let authentication = user?.authentication,
      let idToken = authentication.idToken
    else {
      return
    }
    
    let credential = GoogleAuthProvider.credential(withIDToken: idToken,
                                                   accessToken: authentication.accessToken)
    Objective-C
    FIRAuthCredential *credential =
    [FIRGoogleAuthProvider credentialWithIDToken:result.user.idToken.tokenString
                                     accessToken:result.user.accessToken.tokenString];
    Вход через Facebook
    Swift
    let credential = FacebookAuthProvider
      .credential(withAccessToken: AccessToken.current!.tokenString)
    Objective-C
    FIRAuthCredential *credential = [FIRFacebookAuthProvider
        credentialWithAccessToken:[FBSDKAccessToken currentAccessToken].tokenString];
    Вход с помощью адреса электронной почты и пароля
    Swift
    let credential = EmailAuthProvider.credential(withEmail: email, password: password)
    Objective-C
    FIRAuthCredential *credential =
        [FIREmailAuthProvider credentialWithEmail:email
                                                 password:password];
  3. Передайте объект FIRAuthCredential в метод linkWithCredential:completion: пользователя, выполнившего вход:

    Swift
        user.link(with: credential) { authResult, error in
      // ...
    }
    }
    Objective-C
        [[FIRAuth auth].currentUser linkWithCredential:credential
        completion:^(FIRAuthDataResult *result, NSError *_Nullable error) {
      // ...
    }];

Если вызов linkWithCredential:completion: выполнен успешно, новый аккаунт пользователя может получить доступ к данным Firebase анонимного аккаунта.

Автоматическая очистка

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

  • Любые анонимные аккаунты, созданные после включения автоматической очистки, могут быть автоматически удалены в любое время по истечении 30 дней после создания.
  • Существующие анонимные аккаунты будут автоматически удалены через 30 дней после включения автоматической очистки.
  • Если вы отключите автоматическую очистку, все анонимные аккаунты, запланированные к удалению, останутся в этом статусе.
  • Если вы "обновите" анонимный аккаунт, связав его с любым способом входа, он не будет удален автоматически.

Если вы хотите узнать, сколько пользователей затронет включение этой функции, и вы обновили проект до Firebase Authentication with Identity Platform, вы можете отфильтровать данные по is_anon в Cloud Logging.

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

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