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

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

Вход по электронной почте имеет множество преимуществ:

  • Простая регистрация и вход.
  • Снижение риска повторного использования паролей в приложениях, что может подорвать безопасность даже правильно выбранных паролей.
  • Возможность аутентификации пользователя, а также проверка того, что пользователь является законным владельцем адреса электронной почты.
  • Для входа в систему пользователю требуется только доступная учетная запись электронной почты. Никакого владения номером телефона или учетной записью в социальной сети не требуется.
  • Пользователь может безопасно войти в систему без необходимости вводить (или запоминать) пароль, который может быть затруднительным на мобильном устройстве.
  • Существующего пользователя, который ранее входил в систему с помощью идентификатора электронной почты (пароля или федеративного), можно обновить, чтобы он входил в систему только с помощью электронной почты. Например, пользователь, забывший свой пароль, все равно может войти в систему без необходимости его сброса.

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

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

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

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

  1. В консоли Firebase откройте раздел Auth .
  2. На вкладке «Метод входа» включите поставщика электронной почты и пароля . Обратите внимание, что для использования входа по ссылке электронной почты необходимо включить вход по электронной почте и паролю.
  3. В том же разделе включите метод входа по ссылке электронной почты (вход без пароля) .
  4. Нажмите Сохранить .

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

  1. Создайте объект ActionCodeSettings , который предоставит Firebase инструкции по созданию ссылки электронной почты. Задайте следующие поля:

    • url : глубокая ссылка для встраивания и любое дополнительное состояние, которое необходимо передать. Домен ссылки должен быть внесен в белый список авторизованных доменов консоли Firebase, который можно найти, перейдя на вкладку «Метод входа» (Аутентификация -> Метод входа).
    • iOSBundleID и androidPackageName : помогают Firebase Authentication определить, следует ли создавать ссылку только для Интернета или для мобильных устройств, которая открывается на устройстве Android или Apple.
    • handleCodeInApp : установлено значение true. Операцию входа в систему всегда необходимо выполнять в приложении, в отличие от других внешних действий с электронной почтой (сброс пароля и проверка электронной почты). Это связано с тем, что в конце потока ожидается, что пользователь войдет в систему, и его состояние аутентификации сохранится в приложении.
    • linkDomain : если для проекта определены пользовательские домены ссылок Hosting , укажите, какой из них использовать, когда ссылка должна открываться указанным мобильным приложением. В противном случае автоматически выбирается домен по умолчанию (например, PROJECT_ID .firebaseapp.com ).
    • dynamicLinkDomain : устарел. Не указывайте этот параметр.

    Быстрый

    let actionCodeSettings = ActionCodeSettings()
    actionCodeSettings.url = URL(string: "https://www.example.com")
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = true
    actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!)
    actionCodeSettings.setAndroidPackageName("com.example.android",
                                             installIfNotAvailable: false, minimumVersion: "12")

    Цель-C

    FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
    [actionCodeSettings setURL:[NSURL URLWithString:@"https://www.example.com"]];
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = YES;
    [actionCodeSettings setIOSBundleID:[[NSBundle mainBundle] bundleIdentifier]];
    [actionCodeSettings setAndroidPackageName:@"com.example.android"
                        installIfNotAvailable:NO
                               minimumVersion:@"12"];

    Дополнительные сведения о ActionCodeSettings см. в разделе «Передача состояния в действиях по электронной почте» .

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

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

    Быстрый

    Auth.auth().sendSignInLink(toEmail: email,
                               actionCodeSettings: actionCodeSettings) { error in
      // ...
        if let error = error {
          self.showMessagePrompt(error.localizedDescription)
          return
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        UserDefaults.standard.set(email, forKey: "Email")
        self.showMessagePrompt("Check your email for link")
        // ...
    }

    Цель-C

    [[FIRAuth auth] sendSignInLinkToEmail:email
                       actionCodeSettings:actionCodeSettings
                               completion:^(NSError *_Nullable error) {
      // ...
        if (error) {
          [self showMessagePrompt:error.localizedDescription];
           return;
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        [NSUserDefaults.standardUserDefaults setObject:email forKey:@"Email"];
        [self showMessagePrompt:@"Check your email for link"];
        // ...
    }];

Проблемы безопасности

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

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

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

Завершение входа в мобильное приложение Apple

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

Настройка Firebase Hosting

Firebase Authentication использует домены Firebase Hosting при создании и отправке ссылки, которая должна открываться в мобильном приложении. Домен Firebase Hosting по умолчанию уже настроен для вас.

  1. Настройте домены Firebase Hosting :

    В консоли Firebase откройте раздел Хостинг .

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

      Это значение понадобится вам, когда вы настроите свое приложение для перехвата входящей ссылки.

    • Если вы хотите использовать собственный домен для ссылки электронной почты, вы можете зарегистрировать его на Firebase Hosting и использовать его в качестве домена ссылки.

  2. Настройка приложений Apple:

    Вам нужно будет настроить выбранный домен как связанный домен для ссылок на приложения. Чтобы настроить право в своем приложении, откройте вкладку «Подписание и возможности» цели в Xcode и добавьте домены хостинга Firebase из предыдущего шага к возможности «Связанные домены». Если вы используете домен Firebase Hosting по умолчанию, это будет applinks: PROJECT_ID .firebaseapp.com .

    Дополнительную информацию см. в разделе «Поддержка связанных доменов» на сайте документации Apple.

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

Быстрый

if Auth.auth().isSignIn(withEmailLink: link) {
        Auth.auth().signIn(withEmail: email, link: self.link) { user, error in
          // ...
        }
}

Цель-C

if ([[FIRAuth auth] isSignInWithEmailLink:link]) {
    [[FIRAuth auth] signInWithEmail:email
                               link:link
                         completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      // ...
    }];
}

Чтобы узнать, как выполнить вход по ссылке электронной почты в приложении Android, обратитесь к руководству по Android .

Чтобы узнать, как обрабатывать вход по ссылке электронной почты в веб-приложении, обратитесь к веб-руководству .

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

Разница будет во второй половине операции:

Быстрый

  let credential = EmailAuthCredential.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.link(with: credential) { authData, error in
    if (error) {
      // And error occurred during linking.
      return
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }

Цель-C

  FIRAuthCredential *credential =
      [FIREmailAuthProvider credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      linkWithCredential:credential
              completion:^(FIRAuthDataResult *_Nullable result,
                           NSError *_Nullable error) {
    if (error) {
      // And error occurred during linking.
      return;
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }];

Это также можно использовать для повторной аутентификации пользователя ссылки электронной почты перед выполнением конфиденциальной операции.

Быстрый

  let credential = EmailAuthProvider.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.reauthenticate(with: credential) { authData, error in
    if (error) {
      // And error occurred during re-authentication.
      return
    }
    // The user was successfully re-authenticated.
  }

Цель-C

  FIRAuthCredential *credential =
      [FIREmailAuthCredential credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      reauthenticateWithCredential:credential
                        completion:^(FIRAuthDataResult *_Nullable result,
                                     NSError *_Nullable error) {
    if (error) {
      // And error occurred during re-authentication
      return;
    }
    // The user was successfully re-authenticated.
  }];

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

До версии Firebase Authentication iOS SDK v11.8.0 функция входа по ссылке электронной почты использовала Firebase Dynamic Links для открытия ссылок для входа в правильном приложении. Эти ссылки для проверки устарели, поскольку Firebase Dynamic Links будут отключены 25 августа 2025 года .

Если ваше приложение использует ссылки старого стиля, вам следует перенести свое приложение на новую систему на основе Firebase Hosting .

Если вы создали свой проект 15 сентября 2023 г. или позднее, защита перечисления электронной почты включена по умолчанию. Эта функция повышает безопасность учетных записей пользователей вашего проекта, но отключает метод fetchSignInMethodsForEmail() , который мы ранее рекомендовали для реализации потоков с приоритетом идентификаторов.

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

Дополнительные сведения см. в разделе Включение или отключение защиты перечисления электронной почты .

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

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

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

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

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

Чтобы выйти из системы, вызовите signOut: .

Быстрый

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

Цель-C

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

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

,

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

Вход в систему по электронной почте имеет множество преимуществ:

  • Простая регистрация и вход.
  • Снижение риска повторного использования паролей в приложениях, что может подорвать безопасность даже правильно выбранных паролей.
  • Возможность аутентификации пользователя, а также проверка того, что пользователь является законным владельцем адреса электронной почты.
  • Для входа в систему пользователю требуется только доступная учетная запись электронной почты. Никакого владения номером телефона или учетной записью в социальной сети не требуется.
  • Пользователь может безопасно войти в систему без необходимости вводить (или запоминать) пароль, который может быть затруднительным на мобильном устройстве.
  • Существующего пользователя, который ранее входил в систему с помощью идентификатора электронной почты (пароля или федеративного), можно обновить, чтобы он входил в систему только с помощью электронной почты. Например, пользователь, забывший свой пароль, все равно может войти в систему без необходимости его сброса.

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

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

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

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

  1. В консоли Firebase откройте раздел Auth .
  2. На вкладке «Метод входа» включите поставщика электронной почты и пароля . Обратите внимание, что для использования входа по ссылке электронной почты необходимо включить вход по электронной почте и паролю.
  3. В том же разделе включите метод входа по ссылке электронной почты (вход без пароля) .
  4. Нажмите Сохранить .

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

  1. Создайте объект ActionCodeSettings , который предоставит Firebase инструкции по созданию ссылки электронной почты. Задайте следующие поля:

    • url : глубокая ссылка для встраивания и любое дополнительное состояние, которое необходимо передать. Домен ссылки должен быть внесен в белый список авторизованных доменов консоли Firebase, который можно найти, перейдя на вкладку «Метод входа» (Аутентификация -> Метод входа).
    • iOSBundleID и androidPackageName : помогают Firebase Authentication определить, следует ли создавать ссылку только для Интернета или для мобильных устройств, которая открывается на устройстве Android или Apple.
    • handleCodeInApp : установлено значение true. Операцию входа в систему всегда необходимо выполнять в приложении, в отличие от других внешних действий с электронной почтой (сброс пароля и проверка электронной почты). Это связано с тем, что в конце потока ожидается, что пользователь войдет в систему, и его состояние аутентификации сохранится в приложении.
    • linkDomain : если для проекта определены пользовательские домены ссылок Hosting , укажите, какой из них использовать, когда ссылка должна открываться указанным мобильным приложением. В противном случае автоматически выбирается домен по умолчанию (например, PROJECT_ID .firebaseapp.com ).
    • dynamicLinkDomain : устарел. Не указывайте этот параметр.

    Быстрый

    let actionCodeSettings = ActionCodeSettings()
    actionCodeSettings.url = URL(string: "https://www.example.com")
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = true
    actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!)
    actionCodeSettings.setAndroidPackageName("com.example.android",
                                             installIfNotAvailable: false, minimumVersion: "12")

    Цель-C

    FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
    [actionCodeSettings setURL:[NSURL URLWithString:@"https://www.example.com"]];
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = YES;
    [actionCodeSettings setIOSBundleID:[[NSBundle mainBundle] bundleIdentifier]];
    [actionCodeSettings setAndroidPackageName:@"com.example.android"
                        installIfNotAvailable:NO
                               minimumVersion:@"12"];

    Дополнительные сведения о ActionCodeSettings см. в разделе «Передача состояния в действиях по электронной почте» .

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

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

    Быстрый

    Auth.auth().sendSignInLink(toEmail: email,
                               actionCodeSettings: actionCodeSettings) { error in
      // ...
        if let error = error {
          self.showMessagePrompt(error.localizedDescription)
          return
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        UserDefaults.standard.set(email, forKey: "Email")
        self.showMessagePrompt("Check your email for link")
        // ...
    }

    Цель-C

    [[FIRAuth auth] sendSignInLinkToEmail:email
                       actionCodeSettings:actionCodeSettings
                               completion:^(NSError *_Nullable error) {
      // ...
        if (error) {
          [self showMessagePrompt:error.localizedDescription];
           return;
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        [NSUserDefaults.standardUserDefaults setObject:email forKey:@"Email"];
        [self showMessagePrompt:@"Check your email for link"];
        // ...
    }];

Проблемы безопасности

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

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

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

Завершение входа в мобильное приложение Apple

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

Настройка Firebase Hosting

Firebase Authentication использует домены Firebase Hosting при создании и отправке ссылки, которая должна открываться в мобильном приложении. Домен Firebase Hosting по умолчанию уже настроен для вас.

  1. Настройте домены Firebase Hosting :

    В консоли Firebase откройте раздел Хостинг .

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

      Это значение понадобится вам, когда вы настроите свое приложение для перехвата входящей ссылки.

    • Если вы хотите использовать собственный домен для ссылки электронной почты, вы можете зарегистрировать его на Firebase Hosting и использовать его в качестве домена ссылки.

  2. Настройка приложений Apple:

    Вам нужно будет настроить выбранный домен как связанный домен для ссылок на приложения. Чтобы настроить право в своем приложении, откройте вкладку «Подписание и возможности» цели в Xcode и добавьте домены хостинга Firebase из предыдущего шага к возможности «Связанные домены». Если вы используете домен Firebase Hosting по умолчанию, это будет applinks: PROJECT_ID .firebaseapp.com .

    Дополнительную информацию см. в разделе «Поддержка связанных доменов» на сайте документации Apple.

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

Быстрый

if Auth.auth().isSignIn(withEmailLink: link) {
        Auth.auth().signIn(withEmail: email, link: self.link) { user, error in
          // ...
        }
}

Цель-C

if ([[FIRAuth auth] isSignInWithEmailLink:link]) {
    [[FIRAuth auth] signInWithEmail:email
                               link:link
                         completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      // ...
    }];
}

Чтобы узнать, как выполнить вход по ссылке электронной почты в приложении Android, обратитесь к руководству по Android .

Чтобы узнать, как обрабатывать вход по ссылке электронной почты в веб-приложении, обратитесь к веб-руководству .

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

Разница будет во второй половине операции:

Быстрый

  let credential = EmailAuthCredential.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.link(with: credential) { authData, error in
    if (error) {
      // And error occurred during linking.
      return
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }

Цель-C

  FIRAuthCredential *credential =
      [FIREmailAuthProvider credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      linkWithCredential:credential
              completion:^(FIRAuthDataResult *_Nullable result,
                           NSError *_Nullable error) {
    if (error) {
      // And error occurred during linking.
      return;
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }];

Это также можно использовать для повторной аутентификации пользователя ссылки электронной почты перед выполнением конфиденциальной операции.

Быстрый

  let credential = EmailAuthProvider.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.reauthenticate(with: credential) { authData, error in
    if (error) {
      // And error occurred during re-authentication.
      return
    }
    // The user was successfully re-authenticated.
  }

Цель-C

  FIRAuthCredential *credential =
      [FIREmailAuthCredential credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      reauthenticateWithCredential:credential
                        completion:^(FIRAuthDataResult *_Nullable result,
                                     NSError *_Nullable error) {
    if (error) {
      // And error occurred during re-authentication
      return;
    }
    // The user was successfully re-authenticated.
  }];

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

До версии Firebase Authentication iOS SDK v11.8.0 функция входа по ссылке электронной почты использовала Firebase Dynamic Links для открытия ссылок для входа в правильном приложении. Эти ссылки для проверки устарели, поскольку Firebase Dynamic Links будут отключены 25 августа 2025 года .

Если ваше приложение использует ссылки старого стиля, вам следует перенести свое приложение на новую систему на основе Firebase Hosting .

Если вы создали свой проект 15 сентября 2023 г. или позднее, защита перечисления электронной почты включена по умолчанию. Эта функция повышает безопасность учетных записей пользователей вашего проекта, но отключает метод fetchSignInMethodsForEmail() , который мы ранее рекомендовали для реализации потоков с приоритетом идентификаторов.

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

Дополнительные сведения см. в разделе Включение или отключение защиты перечисления электронной почты .

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

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

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

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

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

Чтобы выйти из системы, вызовите signOut: .

Быстрый

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

Цель-C

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

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

,

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

Вход в систему по электронной почте имеет множество преимуществ:

  • Простая регистрация и вход.
  • Снижение риска повторного использования паролей в приложениях, что может подорвать безопасность даже правильно выбранных паролей.
  • Возможность аутентификации пользователя, а также проверка того, что пользователь является законным владельцем адреса электронной почты.
  • Для входа в систему пользователю требуется только доступная учетная запись электронной почты. Никакого владения номером телефона или учетной записью в социальной сети не требуется.
  • Пользователь может безопасно войти в систему без необходимости вводить (или запоминать) пароль, который может быть затруднительным на мобильном устройстве.
  • Существующего пользователя, который ранее входил в систему с помощью идентификатора электронной почты (пароля или федеративного), можно обновить, чтобы он входил в систему только с помощью электронной почты. Например, пользователь, забывший свой пароль, все равно может войти в систему без необходимости его сброса.

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

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

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

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

  1. В консоли Firebase откройте раздел Auth .
  2. На вкладке «Метод входа» включите поставщика электронной почты и пароля . Обратите внимание, что для использования входа по ссылке электронной почты необходимо включить вход по электронной почте и паролю.
  3. В том же разделе включите метод входа по ссылке электронной почты (вход без пароля) .
  4. Нажмите Сохранить .

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

  1. Создайте объект ActionCodeSettings , который предоставит Firebase инструкции по созданию ссылки электронной почты. Задайте следующие поля:

    • url : глубокая ссылка для встраивания и любое дополнительное состояние, которое необходимо передать. Домен ссылки должен быть внесен в белый список авторизованных доменов консоли Firebase, который можно найти, перейдя на вкладку «Метод входа» (Аутентификация -> Метод входа).
    • iOSBundleID и androidPackageName : помогают Firebase Authentication определить, следует ли создавать ссылку только для Интернета или для мобильных устройств, которая открывается на устройстве Android или Apple.
    • handleCodeInApp : установлено значение true. Операцию входа в систему всегда необходимо выполнять в приложении, в отличие от других внешних действий с электронной почтой (сброс пароля и проверка электронной почты). Это связано с тем, что в конце потока ожидается, что пользователь войдет в систему, и его состояние аутентификации сохранится в приложении.
    • linkDomain : если для проекта определены пользовательские домены ссылок Hosting , укажите, какой из них использовать, когда ссылка должна открываться указанным мобильным приложением. В противном случае автоматически выбирается домен по умолчанию (например, PROJECT_ID .firebaseapp.com ).
    • dynamicLinkDomain : устарел. Не указывайте этот параметр.

    Быстрый

    let actionCodeSettings = ActionCodeSettings()
    actionCodeSettings.url = URL(string: "https://www.example.com")
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = true
    actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!)
    actionCodeSettings.setAndroidPackageName("com.example.android",
                                             installIfNotAvailable: false, minimumVersion: "12")

    Цель-C

    FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
    [actionCodeSettings setURL:[NSURL URLWithString:@"https://www.example.com"]];
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = YES;
    [actionCodeSettings setIOSBundleID:[[NSBundle mainBundle] bundleIdentifier]];
    [actionCodeSettings setAndroidPackageName:@"com.example.android"
                        installIfNotAvailable:NO
                               minimumVersion:@"12"];

    Дополнительные сведения о ActionCodeSettings см. в разделе «Передача состояния в действиях по электронной почте» .

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

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

    Быстрый

    Auth.auth().sendSignInLink(toEmail: email,
                               actionCodeSettings: actionCodeSettings) { error in
      // ...
        if let error = error {
          self.showMessagePrompt(error.localizedDescription)
          return
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        UserDefaults.standard.set(email, forKey: "Email")
        self.showMessagePrompt("Check your email for link")
        // ...
    }

    Цель-C

    [[FIRAuth auth] sendSignInLinkToEmail:email
                       actionCodeSettings:actionCodeSettings
                               completion:^(NSError *_Nullable error) {
      // ...
        if (error) {
          [self showMessagePrompt:error.localizedDescription];
           return;
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        [NSUserDefaults.standardUserDefaults setObject:email forKey:@"Email"];
        [self showMessagePrompt:@"Check your email for link"];
        // ...
    }];

Проблемы безопасности

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

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

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

Завершение входа в мобильное приложение Apple

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

Настройка Firebase Hosting

Firebase Authentication использует домены Firebase Hosting при создании и отправке ссылки, которая должна открываться в мобильном приложении. Домен Firebase Hosting по умолчанию уже настроен для вас.

  1. Настройте домены Firebase Hosting :

    В консоли Firebase откройте раздел Хостинг .

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

      Это значение понадобится вам, когда вы настроите свое приложение для перехвата входящей ссылки.

    • Если вы хотите использовать собственный домен для ссылки электронной почты, вы можете зарегистрировать его на Firebase Hosting и использовать его в качестве домена ссылки.

  2. Настройка приложений Apple:

    Вам нужно будет настроить выбранный домен как связанный домен для ссылок на приложения. Чтобы настроить право в своем приложении, откройте вкладку «Подписание и возможности» цели в Xcode и добавьте домены хостинга Firebase из предыдущего шага к возможности «Связанные домены». Если вы используете домен Firebase Hosting по умолчанию, это будет applinks: PROJECT_ID .firebaseapp.com .

    Дополнительную информацию см. в разделе «Поддержка связанных доменов» на сайте документации Apple.

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

Быстрый

if Auth.auth().isSignIn(withEmailLink: link) {
        Auth.auth().signIn(withEmail: email, link: self.link) { user, error in
          // ...
        }
}

Цель-C

if ([[FIRAuth auth] isSignInWithEmailLink:link]) {
    [[FIRAuth auth] signInWithEmail:email
                               link:link
                         completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      // ...
    }];
}

Чтобы узнать, как выполнить вход по ссылке электронной почты в приложении Android, обратитесь к руководству по Android .

Чтобы узнать, как обрабатывать вход по ссылке электронной почты в веб-приложении, обратитесь к веб-руководству .

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

Разница будет во второй половине операции:

Быстрый

  let credential = EmailAuthCredential.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.link(with: credential) { authData, error in
    if (error) {
      // And error occurred during linking.
      return
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }

Цель-C

  FIRAuthCredential *credential =
      [FIREmailAuthProvider credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      linkWithCredential:credential
              completion:^(FIRAuthDataResult *_Nullable result,
                           NSError *_Nullable error) {
    if (error) {
      // And error occurred during linking.
      return;
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }];

Это также можно использовать для повторной аутентификации пользователя ссылки электронной почты перед выполнением конфиденциальной операции.

Быстрый

  let credential = EmailAuthProvider.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.reauthenticate(with: credential) { authData, error in
    if (error) {
      // And error occurred during re-authentication.
      return
    }
    // The user was successfully re-authenticated.
  }

Цель-C

  FIRAuthCredential *credential =
      [FIREmailAuthCredential credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      reauthenticateWithCredential:credential
                        completion:^(FIRAuthDataResult *_Nullable result,
                                     NSError *_Nullable error) {
    if (error) {
      // And error occurred during re-authentication
      return;
    }
    // The user was successfully re-authenticated.
  }];

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

До версии Firebase Authentication iOS SDK v11.8.0 функция входа по ссылке электронной почты использовала Firebase Dynamic Links для открытия ссылок для входа в правильном приложении. Эти ссылки для проверки устарели, поскольку Firebase Dynamic Links будут отключены 25 августа 2025 года .

Если ваше приложение использует ссылки старого стиля, вам следует перенести свое приложение на новую систему на основе Firebase Hosting .

Если вы создали свой проект 15 сентября 2023 г. или позднее, защита перечисления электронной почты включена по умолчанию. Эта функция повышает безопасность учетных записей пользователей вашего проекта, но отключает метод fetchSignInMethodsForEmail() , который мы ранее рекомендовали для реализации потоков с приоритетом идентификаторов.

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

Дополнительные сведения см. в разделе Включение или отключение защиты перечисления электронной почты .

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

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

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

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

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

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

Быстрый

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

Объектив-c

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

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

,

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

Есть многочисленные преимущества для входа по электронной почте:

  • Низкое трение регистрация и вход.
  • Более низкий риск повторного использования паролей в разных приложениях, что может подорвать безопасность даже хорошо отобранных паролей.
  • Возможность аутентификации пользователя, а также проверять, что пользователь является законным владельцем адреса электронной почты.
  • Пользователю нужна только доступная учетная запись электронной почты для входа. Не требуется право собственности на номер телефона или учетную запись в социальных сетях.
  • Пользователь может безопасно войти без необходимости предоставить (или запомнить) пароль, который может быть громоздким на мобильном устройстве.
  • Существующий пользователь, который ранее вписался с идентификатором электронной почты (пароль или федеративный), может быть обновлен, чтобы войти в систему только с помощью электронной почты. Например, пользователь, который забыл свой пароль, все еще может войти в систему без необходимости сбросить свой пароль.

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

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

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

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

  1. В консоли Firebase откройте раздел аудитории .
  2. На вкладке «Метод регистрации» включите провайдера электронной почты/пароля . Обратите внимание, что вход электронной почты/пароля должен быть включен для использования ссылки по электронной почте.
  3. В том же разделе включите метод входа в систему электронной почты (вход без пароля) .
  4. Нажмите Сохранить .

Чтобы инициировать поток аутентификации, представьте пользователя интерфейсом, который побуждает пользователя предоставить свой адрес электронной почты, а затем Call sendSignInLink для запроса, чтобы Firebase отправил ссылку на аутентификацию на электронную почту пользователя.

  1. Построить объект ActionCodeSettings , который предоставляет Firebase инструкции о том, как построить ссылку по электронной почте. Установите следующие поля:

    • url : глубокая связь с внедрением и любое дополнительное состояние, которое будет передано. Домен ссылки должен быть белым списком в списке авторизованных доменов Firebase Console, которые можно найти, перейдя на вкладку «Метод входа» (метод аутентификации-> Метод регистрации).
    • iOSBundleID и androidPackageName : помогает Firebase Authentication определить, должна ли она создать только для веб-сайта или мобильную ссылку, которая открывается на устройстве Android или Apple.
    • handleCodeInApp : установить на True. Операция входа должна всегда быть завершена в приложении, в отличие от других действий по электронной почте вне полосы (сброс пароля и проверка электронной почты). Это связано с тем, что в конце потока ожидается, что пользователь будет подписан, и их состояние авторитета сохраняется в приложении.
    • linkDomain : Когда для проекта определяются домены на заказ ссылок Hosting , укажите, какой из них используется, когда ссылка будет открыта указанным мобильным приложением. В противном случае домен по умолчанию выбран автоматически (например, PROJECT_ID .firebaseapp.com ).
    • dynamicLinkDomain : устарел. Не указывайте этот параметр.

    Быстрый

    let actionCodeSettings = ActionCodeSettings()
    actionCodeSettings.url = URL(string: "https://www.example.com")
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = true
    actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!)
    actionCodeSettings.setAndroidPackageName("com.example.android",
                                             installIfNotAvailable: false, minimumVersion: "12")

    Объектив-c

    FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
    [actionCodeSettings setURL:[NSURL URLWithString:@"https://www.example.com"]];
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = YES;
    [actionCodeSettings setIOSBundleID:[[NSBundle mainBundle] bundleIdentifier]];
    [actionCodeSettings setAndroidPackageName:@"com.example.android"
                        installIfNotAvailable:NO
                               minimumVersion:@"12"];

    Чтобы узнать больше о ActionCodeSettings , обратитесь к разделу «Проходящее состояние в действиях по электронной почте» .

  2. Спросите у пользователя их электронное письмо.

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

    Быстрый

    Auth.auth().sendSignInLink(toEmail: email,
                               actionCodeSettings: actionCodeSettings) { error in
      // ...
        if let error = error {
          self.showMessagePrompt(error.localizedDescription)
          return
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        UserDefaults.standard.set(email, forKey: "Email")
        self.showMessagePrompt("Check your email for link")
        // ...
    }

    Объектив-c

    [[FIRAuth auth] sendSignInLinkToEmail:email
                       actionCodeSettings:actionCodeSettings
                               completion:^(NSError *_Nullable error) {
      // ...
        if (error) {
          [self showMessagePrompt:error.localizedDescription];
           return;
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        [NSUserDefaults.standardUserDefaults setObject:email forKey:@"Email"];
        [self showMessagePrompt:@"Check your email for link"];
        // ...
    }];

Проблемы безопасности

Чтобы предотвратить использование ссылки входа в систему для входа в систему в качестве непреднамеренного пользователя или на непреднамеренном устройстве, Firebase Auth требует, чтобы адрес электронной почты пользователя был предоставлен при завершении потока регистрации. Для входа в успех этот адрес электронной почты должен соответствовать адресу, на который первоначально была отправлена ​​ссылка входа.

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

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

Завершение входа в мобильное приложение Apple

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

Настройте Firebase Hosting

Firebase Authentication использует домены Firebase Hosting при создании и отправке ссылки, которая должна быть открыта в мобильном приложении. Домен Firebase Hosting по умолчанию уже настроен для вас.

  1. Настройте домены Firebase Hosting :

    В консоли Firebase откройте раздел хостинга .

    • Если вы хотите использовать домен по умолчанию для ссылки по электронной почте, которая открывается в мобильных приложениях, перейдите на сайт по умолчанию и обратите внимание на домен Hosting по умолчанию. Домен Hosting по умолчанию обычно выглядит так: PROJECT_ID .firebaseapp.com .

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

    • Если вы хотите использовать пользовательский домен для ссылки по электронной почте, вы можете зарегистрировать один в Firebase Hosting и использовать его для домена ссылки.

  2. Настройка приложений Apple:

    Вам нужно будет настроить выбранную домен как связанный домен для ссылок приложений. Чтобы настроить право в вашем приложении, откройте вкладку «Подписание и возможности Target» в XCode и добавьте домены хостинга Firebase из предыдущего шага к возможностям связанных доменов. При использовании домена Firebase Hosting по умолчанию это будет applinks: PROJECT_ID .firebaseapp.com .

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

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

Быстрый

if Auth.auth().isSignIn(withEmailLink: link) {
        Auth.auth().signIn(withEmail: email, link: self.link) { user, error in
          // ...
        }
}

Объектив-c

if ([[FIRAuth auth] isSignInWithEmailLink:link]) {
    [[FIRAuth auth] signInWithEmail:email
                               link:link
                         completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      // ...
    }];
}

Чтобы узнать о том, как обрабатывать вход с ссылкой по электронной почте в приложении Android, обратитесь к руководству Android .

Чтобы узнать о том, как обрабатывать вход с ссылкой по электронной почте в веб-приложении, обратитесь к веб-руководству .

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

Разница была бы во второй половине операции:

Быстрый

  let credential = EmailAuthCredential.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.link(with: credential) { authData, error in
    if (error) {
      // And error occurred during linking.
      return
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }

Объектив-c

  FIRAuthCredential *credential =
      [FIREmailAuthProvider credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      linkWithCredential:credential
              completion:^(FIRAuthDataResult *_Nullable result,
                           NSError *_Nullable error) {
    if (error) {
      // And error occurred during linking.
      return;
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }];

Это также можно использовать для повторной аутентификации пользователя ссылки по электронной почте перед выполнением конфиденциальной операции.

Быстрый

  let credential = EmailAuthProvider.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.reauthenticate(with: credential) { authData, error in
    if (error) {
      // And error occurred during re-authentication.
      return
    }
    // The user was successfully re-authenticated.
  }

Объектив-c

  FIRAuthCredential *credential =
      [FIREmailAuthCredential credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      reauthenticateWithCredential:credential
                        completion:^(FIRAuthDataResult *_Nullable result,
                                     NSError *_Nullable error) {
    if (error) {
      // And error occurred during re-authentication
      return;
    }
    // The user was successfully re-authenticated.
  }];

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

До Firebase Authentication iOS SDK V11.8.0 функция ссылки на электронную почту, основанная на Firebase Dynamic Links , на открытые ссылки в правильном приложении. Эти ссылки на проверку устарели, так как Firebase Dynamic Links отключатся 25 августа 2025 года .

Если ваше приложение использует ссылки старого стиля, вы должны перенести свое приложение в новую систему на основе Firebase Hosting .

Если вы создали свой проект 15 сентября 2023 года или после этого, защита от перечисления электронной почты включена по умолчанию. Эта функция улучшает безопасность учетных записей пользователей вашего проекта, но она отключает метод fetchSignInMethodsForEmail() , который мы ранее рекомендовали реализовать потоки идентификатора.

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

Чтобы узнать больше, см. Включить или отключить защиту от перечисления электронной почты .

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

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

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

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

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

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

Быстрый

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

Объектив-c

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

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