Анонимная аутентификация с помощью 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 (Способ входа) включите поставщика для анонимного входа.
    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.