Вы можете использовать Firebase Authentication, чтобы пользователь мог войти в аккаунт, нажав на ссылку в электронном письме. В процессе также проверяется адрес электронной почты пользователя.
Вход с помощью адреса электронной почты имеет ряд преимуществ:
- Простая регистрация и вход.
- Снижается риск использования одного и того же пароля в разных приложениях, что может подорвать безопасность даже при использовании надежных паролей.
- Возможность аутентифицировать пользователя и одновременно подтвердить, что он является законным владельцем адреса электронной почты.
- Для входа в аккаунт пользователю нужен только доступ к электронной почте. Вам не нужно владеть номером телефона или аккаунтом в социальной сети.
- Пользователь может безопасно войти в аккаунт, не вводя пароль (и не запоминая его), что может быть неудобно на мобильном устройстве.
- Существующий пользователь, который ранее входил в систему с помощью идентификатора электронной почты (пароля или федеративного аккаунта), может перейти на вход только с помощью электронной почты. Например, пользователь, который забыл пароль, сможет войти в аккаунт, не сбрасывая его.
Подготовка
Для установки зависимостей Firebase и управления ими используйте Swift Package Manager.
- Откройте проект приложения в Xcode и перейдите в меню File (Файл) > Add Packages (Добавить пакеты).
- Когда появится запрос, добавьте хранилище Firebase SDK для платформ Apple:
- Выберите библиотеку Firebase Authentication.
- Добавьте флаг
-ObjCв раздел Other Linker Flags (Другие флаги компоновщика) в настройках сборки целевого объекта. - После этого Xcode автоматически начнет распознавать и скачивать зависимости в фоновом режиме.
https://github.com/firebase/firebase-ios-sdk.git
Как включить вход по ссылке в проекте Firebase
Чтобы пользователи могли входить в аккаунт по ссылке, отправленной на электронную почту, сначала включите поставщика "Электронная почта" и метод входа "Ссылка на электронную почту" для своего проекта Firebase:
В консоли Firebase выберите Безопасность > Аутентификация.
На вкладке Sign-in method (Способ входа) включите поставщика услуг входа Email/Password (Электронная почта/Пароль). Обратите внимание, что для входа по ссылке необходимо включить вход с использованием адреса электронной почты и пароля.
В том же разделе включите поставщика Ссылка на электронную почту (вход без пароля).
Нажмите Сохранить.
Отправка ссылки для аутентификации на адрес электронной почты пользователя
Чтобы запустить процесс аутентификации, покажите пользователю интерфейс, в котором он сможет ввести свой адрес электронной почты, а затем вызовите sendSignInLink, чтобы Firebase отправил ссылку для аутентификации на указанный адрес.
Создайте объект
ActionCodeSettings, который содержит инструкции для Firebase о том, как создать ссылку в письме. Задайте следующие поля:url– ссылка на контент, которую нужно встроить, и любые дополнительные данные, которые нужно передать. Если вы ещё не добавили домен в список авторизованных доменов, сделайте это:В консоли Firebase выберите Безопасность > Аутентификация > вкладка Настройки.
В разделе Авторизованные домены нажмите Добавить домен и добавьте свой домен.
iOSBundleIDиandroidPackageName: помогают Firebase Authentication определить, нужно ли создавать ссылку только для сайта или ссылку для мобильного устройства, которая открывается на устройстве Android или Apple.handleCodeInApp– задайте значение true. В отличие от других действий, выполняемых вне приложения (например, сброса пароля и подтверждения адреса электронной почты), вход в аккаунт всегда должен осуществляться в приложении. Это связано с тем, что в конце процесса пользователь должен войти в аккаунт, а состояние аутентификации должно сохраниться в приложении.linkDomain: если для проекта определены специальные домены ссылок Hosting, укажите, какой из них следует использовать, когда ссылка открывается в определенном мобильном приложении. В противном случае автоматически выбирается домен по умолчанию (например, ).PROJECT_ID.firebaseapp.comdynamicLinkDomain: поддержка прекращена. Не указывайте этот параметр.
Swift
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")
Objective-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рассказывается в разделе Передача состояния в действиях с электронной почтой.Запросите у пользователя адрес электронной почты.
Отправьте ссылку для аутентификации на адрес электронной почты пользователя и сохраните этот адрес на случай, если пользователь выполнит вход с помощью электронной почты на том же устройстве.
Swift
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") // ... }
Objective-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 по умолчанию.
Настройте домены Firebase Hosting:
В консоли Firebase выберите Хостинг и бессерверные вычисления > Хостинг.
Если вы хотите использовать домен по умолчанию для ссылки в электронном письме, которая открывается в мобильных приложениях, перейдите на сайт по умолчанию и запишите домен Hosting. Домен Hosting по умолчанию обычно выглядит так:
.PROJECT_ID.firebaseapp.comЭто значение понадобится вам, когда вы будете настраивать приложение для перехвата входящей ссылки.
Если вы хотите использовать собственный домен для ссылки в электронном письме, вы можете зарегистрировать его в Firebase Hosting и использовать его для домена ссылки.
Настройка приложений Apple:
Вам нужно будет настроить выбранный домен как связанный домен для ссылок на приложения. Чтобы настроить право в приложении, откройте вкладку Подписание и возможности целевого объекта в Xcode и добавьте домены Firebase Hosting, полученные на предыдущем шаге, в возможность "Связанные домены ". Если используется домен Firebase Hosting по умолчанию, значением будет
.applinks:PROJECT_ID.firebaseapp.comПодробнее о том, как поддерживать связанные домены…
Как подтвердить связь и войти в аккаунт
После того как вы получите ссылку, убедитесь, что она предназначена для аутентификации по электронной почте, и войдите в аккаунт.
Swift
if Auth.auth().isSignIn(withEmailLink: link) { Auth.auth().signIn(withEmail: email, link: self.link) { user, error in // ... } }
Objective-C
if ([[FIRAuth auth] isSignInWithEmailLink:link]) { [[FIRAuth auth] signInWithEmail:email link:link completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { // ... }]; }
Чтобы узнать, как реализовать вход с помощью ссылки в письме в приложении для Android, ознакомьтесь с руководством по Android.
Чтобы узнать, как обрабатывать вход с помощью ссылки в электронном письме в веб-приложении, ознакомьтесь с руководством по работе с веб-приложениями.
Установка связи или повторная аутентификация с помощью ссылки в электронном письме
Вы также можете связать этот способ аутентификации с существующим пользователем. Например, пользователь, ранее прошедший аутентификацию с помощью другого поставщика, такого как номер телефона, может добавить этот способ входа в свой существующий аккаунт.
Разница будет во второй половине операции:
Swift
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. }
Objective-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. }];
Также этот метод можно использовать для повторной аутентификации пользователя, перешедшего по ссылке в электронном письме, перед выполнением конфиденциальной операции.
Swift
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. }
Objective-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 Dynamic Links
До версии 11.8.0 Firebase Authentication iOS SDK функция входа по ссылке в электронном письме использовала Firebase Dynamic Links для открытия ссылок для входа в нужном приложении. Эти ссылки для подтверждения устарели, поскольку Firebase Dynamic Links будет отключен 25 августа 2025 г..
Если в вашем приложении используются ссылки старого типа, вам следует перенести приложение на новую систему на основе Firebase Hosting.
Устарело: различие между адресом электронной почты и паролем и ссылкой для входа
Если вы создали проект 15 сентября 2023 г. или позже, защита от перечисления адресов электронной почты включена по умолчанию. Эта функция повышает безопасность аккаунтов пользователей проекта, но отключает метод fetchSignInMethodsForEmail(), который мы ранее рекомендовали для реализации потоков с идентификатором.
Хотя вы можете отключить защиту от перечисления адресов электронной почты для своего проекта, мы не рекомендуем этого делать.
Подробнее о том, как включить или отключить защиту от перечисления адресов электронной почты…
Дальнейшие действия
После первого входа пользователя создается новый аккаунт, связанный с учетными данными, которые он использовал (именем пользователя и паролем, номером телефона или информацией поставщика услуг аутентификации). Этот новый аккаунт хранится в проекте 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; }
Также рекомендуем добавить код обработки ошибок для всех возможных ошибок аутентификации. Подробнее об обработке ошибок…