Вы можете использовать аутентификацию Firebase для входа пользователя, отправив ему электронное письмо, содержащее ссылку, по которой он может щелкнуть, чтобы войти в систему. При этом также проверяется адрес электронной почты пользователя.
Вход в систему по электронной почте имеет множество преимуществ:
- Простая регистрация и вход.
- Снижение риска повторного использования паролей в приложениях, что может подорвать безопасность даже правильно выбранных паролей.
- Возможность аутентификации пользователя, а также проверка того, что пользователь является законным владельцем адреса электронной почты.
- Для входа в систему пользователю требуется только доступная учетная запись электронной почты. Никакого владения номером телефона или учетной записью в социальной сети не требуется.
- Пользователь может безопасно войти в систему без необходимости вводить (или запоминать) пароль, который может быть затруднительным на мобильном устройстве.
- Существующего пользователя, который ранее входил в систему с помощью идентификатора электронной почты (пароля или федеративного), можно обновить, чтобы он входил в систему только с помощью электронной почты. Например, пользователь, забывший свой пароль, все равно может войти в систему без необходимости его сброса.
Прежде чем начать
Если вы еще этого не сделали, выполните действия, описанные в руководстве по началу работы .
Включите вход по электронной почте для вашего проекта Firebase.
Чтобы войти в систему по ссылке электронной почты, сначала необходимо включить поставщика электронной почты и метод входа по ссылке электронной почты для вашего проекта Firebase:
- В консоли Firebase откройте раздел Auth .
- На вкладке «Метод входа» включите поставщика электронной почты и пароля . Обратите внимание, что для использования входа по ссылке электронной почты необходимо включить вход по электронной почте и паролю.
- В том же разделе включите метод входа по ссылке электронной почты (вход без пароля) .
- Нажмите Сохранить .
Отправьте ссылку для аутентификации на адрес электронной почты пользователя.
Чтобы инициировать поток аутентификации, представьте интерфейс, который предлагает пользователю указать свой адрес электронной почты, а затем вызовите sendSignInLinkToEmail()
, чтобы запросить у Firebase отправку ссылки аутентификации на электронную почту пользователя.
Создайте объект ActionCodeSettings, который предоставит Firebase инструкции по созданию ссылки электронной почты. Задайте следующие поля:
url
: глубокая ссылка для встраивания и любое дополнительное состояние, которое необходимо передать. Домен ссылки должен быть внесен в белый список авторизованных доменов консоли Firebase, который можно найти, перейдя на вкладку «Метод входа» (Аутентификация -> Метод входа). Ссылка перенаправит пользователя на этот URL-адрес, если приложение не установлено на его устройстве и его не удалось установить.androidPackageName
иIOSBundleId
: приложения, которые будут использоваться при открытии ссылки для входа на устройстве Android или iOS. Узнайте больше о том, как настроить динамические ссылки Firebase для открытия ссылок действий по электронной почте через мобильные приложения.handleCodeInApp
: установлено значениеtrue
. Операцию входа в систему всегда необходимо выполнять в приложении, в отличие от других внешних действий с электронной почтой (сброс пароля и проверка электронной почты). Это связано с тем, что в конце потока ожидается, что пользователь войдет в систему, и его состояние аутентификации сохранится в приложении.dynamicLinkDomain
: если для проекта определено несколько пользовательских доменов динамических ссылок, укажите, какой из них использовать, когда ссылка должна открываться через указанное мобильное приложение (например,example.page.link
). В противном случае автоматически выбирается первый домен.
var acs = ActionCodeSettings( // URL you want to redirect back to. The domain (www.example.com) for this // URL must be whitelisted in the Firebase Console. url: 'https://www.example.com/finishSignUp?cartId=1234', // This must be true handleCodeInApp: true, iOSBundleId: 'com.example.ios', androidPackageName: 'com.example.android', // installIfNotAvailable androidInstallApp: true, // minimumVersion androidMinimumVersion: '12');
Попросите пользователя указать адрес электронной почты.
Отправьте ссылку для аутентификации на адрес электронной почты пользователя и сохраните адрес электронной почты пользователя на случай, если пользователь завершит вход в систему по электронной почте на том же устройстве.
var emailAuth = 'someemail@domain.com'; FirebaseAuth.instance.sendSignInLinkToEmail( email: emailAuth, actionCodeSettings: acs) .catchError((onError) => print('Error sending email verification $onError')) .then((value) => print('Successfully sent email verification')); });
Завершите вход по ссылке электронной почты.
Проблемы безопасности
Чтобы предотвратить использование ссылки для входа в систему в качестве непредусмотренного пользователя или на непредусмотренном устройстве, Firebase Auth требует предоставления адреса электронной почты пользователя при завершении процесса входа. Чтобы вход прошел успешно, этот адрес электронной почты должен совпадать с адресом, на который изначально была отправлена ссылка для входа.
Вы можете упростить этот процесс для пользователей, которые открывают ссылку для входа на том же устройстве, на котором они запрашивают ссылку, сохраняя их адрес электронной почты локально (например, с помощью SharedPreferences) при отправке электронного письма для входа. Затем используйте этот адрес для завершения потока. Не передавайте адрес электронной почты пользователя в параметрах URL-адреса перенаправления и не используйте его повторно, поскольку это может активировать внедрение сеансов.
После завершения входа в систему все предыдущие непроверенные механизмы входа будут удалены у пользователя, а все существующие сеансы будут признаны недействительными. Например, если кто-то ранее создал неподтвержденную учетную запись с тем же адресом электронной почты и паролем, пароль пользователя будет удален, чтобы предотвратить повторный вход в систему с непроверенным адресом электронной почты и паролем двойнику, заявившему право собственности и создавшему эту неподтвержденную учетную запись.
Также убедитесь, что вы используете URL-адрес HTTPS в производстве, чтобы избежать потенциального перехвата вашей ссылки промежуточными серверами.
Подтвердите ссылку на адрес электронной почты и войдите в систему.
Аутентификация Firebase использует динамические ссылки Firebase для отправки ссылки по электронной почте на мобильное устройство. Для завершения входа через мобильное приложение приложение должно быть настроено на обнаружение входящей ссылки приложения, анализ базовой глубокой ссылки и затем завершение входа.
Настройте свое приложение для получения динамических ссылок на Flutter в руководстве .
В обработчике ссылок проверьте, предназначена ли ссылка для аутентификации по электронной почте, и если да, завершите процесс входа.
// Confirm the link is a sign-in with email link. if (FirebaseAuth.instance.isSignInWithEmailLink(emailLink)) { try { // The client SDK will parse the code from the link for you. final userCredential = await FirebaseAuth.instance .signInWithEmailLink(email: emailAuth, emailLink: emailLink); // You can access the new user via userCredential.user. final emailAddress = userCredential.user?.email; print('Successfully signed in with email link!'); } catch (error) { print('Error signing in with email link.'); } }
Привязка/повторная аутентификация по ссылке электронной почты
Вы также можете связать этот метод аутентификации с существующим пользователем. Например, пользователь, ранее прошедший аутентификацию у другого провайдера, например по номеру телефона, может добавить этот метод входа в свою существующую учетную запись.
Разница будет во второй половине операции:
final authCredential = EmailAuthProvider
.credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
await FirebaseAuth.instance.currentUser
?.linkWithCredential(authCredential);
} catch (error) {
print("Error linking emailLink credential.");
}
Это также можно использовать для повторной аутентификации пользователя ссылки электронной почты перед выполнением конфиденциальной операции.
final authCredential = EmailAuthProvider
.credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
await FirebaseAuth.instance.currentUser
?.reauthenticateWithCredential(authCredential);
} catch (error) {
print("Error reauthenticating credential.");
}
Однако, поскольку поток может оказаться на другом устройстве, где исходный пользователь не вошел в систему, этот поток может не быть завершен. В этом случае пользователю может быть показано сообщение об ошибке, чтобы заставить его открыть ссылку на том же устройстве. В ссылке можно передать некоторое состояние, чтобы предоставить информацию о типе операции и идентификаторе пользователя.
Устарело: отличие пароля электронной почты от ссылки электронной почты.
Если вы создали свой проект 15 сентября 2023 г. или позднее, защита перечисления электронной почты включена по умолчанию. Эта функция повышает безопасность учетных записей пользователей вашего проекта, но отключает метод fetchSignInMethodsForEmail()
, который мы ранее рекомендовали для реализации потоков с приоритетом идентификаторов.
Хотя вы можете отключить защиту перечисления электронной почты для своего проекта, мы не рекомендуем этого делать.
Дополнительные сведения см. в документации по защите перечисления электронной почты .
Следующие шаги
После того как пользователь создает новую учетную запись, эта учетная запись сохраняется как часть вашего проекта Firebase и может использоваться для идентификации пользователя в каждом приложении вашего проекта, независимо от того, какой метод входа использовал пользователь.
В своих приложениях вы можете получить базовую информацию профиля пользователя из объекта User
. См. Управление пользователями .
В правилах безопасности базы данных реального времени и облачного хранилища Firebase вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной auth
и использовать его для управления тем, к каким данным пользователь может получить доступ.
Вы можете разрешить пользователям входить в ваше приложение с использованием нескольких поставщиков аутентификации , привязав учетные данные поставщика аутентификации к существующей учетной записи пользователя.
Чтобы выйти из системы, вызовите signOut()
:
await FirebaseAuth.instance.signOut();