Вы можете использовать аутентификацию Firebase для входа пользователя в систему, отправив ему электронное письмо со ссылкой, по которой он может щелкнуть для входа в систему. В ходе этого процесса также проверяется адрес электронной почты пользователя.
Вход по электронной почте имеет ряд преимуществ:
- Простая регистрация и вход в систему.
- Снижение риска повторного использования паролей в разных приложениях, что может подорвать безопасность даже тщательно выбранных паролей.
- Возможность аутентификации пользователя, а также проверка того, является ли пользователь законным владельцем адреса электронной почты.
- Для входа в систему пользователю необходим только доступный адрес электронной почты. Наличие номера телефона или учетной записи в социальных сетях не требуется.
- Пользователь может безопасно войти в систему без необходимости вводить (или запоминать) пароль, что может быть неудобно на мобильном устройстве.
- Существующий пользователь, который ранее входил в систему с помощью идентификатора электронной почты (пароля или федеративного), может быть обновлен для входа только с помощью электронной почты. Например, пользователь, который забыл свой пароль, все равно может войти в систему без необходимости сбрасывать свой пароль.
Прежде чем начать
Используйте Swift Package Manager для установки и управления зависимостями Firebase.
- В Xcode откройте проект приложения и перейдите в меню Файл > Добавить пакеты .
- При появлении соответствующего запроса добавьте репозиторий Firebase Apple platform SDK:
- Выберите библиотеку Firebase Authentication .
- Добавьте флаг
-ObjC
в раздел «Другие флаги компоновщика» настроек сборки вашей цели. - По завершении Xcode автоматически начнет разрешать и загружать ваши зависимости в фоновом режиме.
https://github.com/firebase/firebase-ios-sdk.git
Включите вход по ссылке электронной почты для вашего проекта Firebase
Чтобы авторизовать пользователей по ссылке электронной почты, необходимо сначала включить поставщика электронной почты и метод входа по ссылке электронной почты для вашего проекта Firebase:
- В консоли Firebase откройте раздел Auth .
- На вкладке Sign in method включите поставщика Email/Password . Обратите внимание, что для использования входа по ссылке на электронную почту необходимо включить вход по электронной почте/паролю.
- В этом же разделе включите метод входа по ссылке на электронную почту (вход без пароля) .
- Нажмите «Сохранить» .
Отправить ссылку аутентификации на адрес электронной почты пользователя
Чтобы инициировать процесс аутентификации, предоставьте пользователю интерфейс, который предлагает ему указать свой адрес электронной почты, а затем вызовите sendSignInLink
, чтобы запросить у Firebase отправку ссылки для аутентификации на электронную почту пользователя.
Создайте объект
ActionCodeSettings
, который предоставляет Firebase инструкции о том, как создать ссылку на электронную почту. Установите следующие поля:-
url
: Глубокая ссылка для встраивания и любое дополнительное состояние, которое должно быть передано. Домен ссылки должен быть внесен в белый список в списке авторизованных доменов Firebase Console, который можно найти, перейдя на вкладку Метод входа (Аутентификация -> Метод входа).
-
iOSBundleID
иandroidPackageName
: помогают Firebase Authentication определить, следует ли создавать веб-ссылку или мобильную ссылку, открываемую на устройстве Android или Apple. -
handleCodeInApp
: установлено значение true. Операция входа всегда должна быть завершена в приложении, в отличие от других действий электронной почты вне диапазона (сброс пароля и проверки электронной почты). Это связано с тем, что в конце потока ожидается, что пользователь войдет в систему, а его состояние Auth сохранится в приложении. -
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")
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
см. в разделе Передача состояния в действиях электронной почты .-
Спросите у пользователя его адрес электронной почты.
Отправьте ссылку для аутентификации на адрес электронной почты пользователя и сохраните адрес электронной почты пользователя на случай, если пользователь завершит вход в систему по электронной почте на том же устройстве.
Быстрый
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:
Вам нужно будет настроить выбранный домен как ассоциированный домен для ссылок приложений. Чтобы настроить права в вашем приложении, откройте вкладку Signing & Capabilities целевого объекта в Xcode и добавьте домены Firebase Hosting из предыдущего шага в возможность Associated Domains. Если вы используете домен 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 // ... } }
Objective-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. }
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. }];
Эту функцию также можно использовать для повторной аутентификации пользователя, перешедшего по ссылке электронной почты, перед выполнением конфиденциальной операции.
Быстрый
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. }];
Однако, поскольку поток может оказаться на другом устройстве, где исходный пользователь не вошел в систему, этот поток может не быть завершен. В этом случае пользователю может быть показана ошибка, чтобы заставить его открыть ссылку на том же устройстве. В ссылке может быть передано некоторое состояние, чтобы предоставить информацию о типе операции и uid пользователя.
Устаревшее: проверка на основе Firebase Dynamic Links
До 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 вы можете получить уникальный идентификатор вошедшего в систему пользователя из переменной
auth
и использовать его для управления данными, к которым пользователь может получить доступ.
Вы можете разрешить пользователям входить в ваше приложение с использованием нескольких поставщиков аутентификации, связав учетные данные поставщика аутентификации с существующей учетной записью пользователя.
Чтобы выйти из системы пользователя, вызовите signOut:
Быстрый
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; }
Вы также можете захотеть добавить код обработки ошибок для всего диапазона ошибок аутентификации. См. Обработка ошибок .