Для авторизации пользователя с помощью Firebase Authentication можно отправить ему электронное письмо со ссылкой, по которой он сможет войти в систему. При этом также проверяется адрес электронной почты пользователя.
Вход в систему по электронной почте имеет множество преимуществ:
- Простая регистрация и авторизация.
- Снижается риск повторного использования паролей в разных приложениях, что может подорвать безопасность даже тщательно подобранных паролей.
- Возможность аутентифицировать пользователя, одновременно проверяя, является ли он законным владельцем адреса электронной почты.
- Для входа в систему пользователю достаточно иметь доступный адрес электронной почты. Наличие номера телефона или аккаунта в социальных сетях не требуется.
- Пользователь может безопасно войти в систему без необходимости вводить (или запоминать) пароль, что может быть неудобно на мобильном устройстве.
- Существующий пользователь, ранее входивший в систему с помощью адреса электронной почты (пароля или федеративной аутентификации), может быть переведен на вход только с помощью адреса электронной почты. Например, пользователь, забывший свой пароль, может войти в систему без необходимости его сброса.
Прежде чем начать
Если вы еще этого не сделали, выполните действия, описанные в руководстве по началу работы .
Включите вход по ссылке из электронной почты для вашего проекта Firebase.
Для авторизации пользователей по ссылке из электронной почты необходимо сначала включить поставщика услуг электронной почты и метод авторизации по ссылке из электронной почты для вашего проекта Firebase:
- В консоли Firebase откройте раздел «Аутентификация» .
- На вкладке «Способ входа» включите поставщик услуг «Электронная почта/Пароль» . Обратите внимание, что для входа по ссылке из электронной почты необходимо включить вход по электронной почте/паролю.
- В этом же разделе включите метод входа по ссылке из электронной почты (вход без пароля) .
- Нажмите « Сохранить ».
Отправить ссылку для аутентификации на электронный адрес пользователя.
Для запуска процесса аутентификации отобразите интерфейс, который запрашивает у пользователя адрес электронной почты, а затем вызовите функцию sendSignInLinkToEmail() чтобы запросить у Firebase отправку ссылки для аутентификации на электронную почту пользователя.
Создайте объект ActionCodeSettings, который предоставит Firebase инструкции по созданию ссылки в электронном письме. Установите следующие поля:
url: Прямая ссылка для встраивания и любые дополнительные данные, которые необходимо передать. Домен ссылки должен присутствовать в списке авторизованных доменов в консоли Firebase, который можно найти на вкладке «Настройки» (Аутентификация -> Настройки -> Авторизованные домены). Ссылка перенаправит пользователя на этот URL, если приложение не установлено на его устройстве и его не удалось установить.androidPackageNameиIOSBundleId: приложения, которые будут использоваться при открытии ссылки для входа в систему на устройстве Android или iOS. Подробнее о настройке Firebase Dynamic Links для открытия ссылок действий в электронных письмах через мобильные приложения.handleCodeInApp: Установите значениеtrue. Операция входа в систему всегда должна выполняться в приложении, в отличие от других действий, выполняемых вне приложения (сброс пароля и подтверждение электронной почты). Это связано с тем, что по завершении процесса ожидается, что пользователь войдет в систему, и его состояние аутентификации сохранится в приложении.dynamicLinkDomain: (Устарело, используйтеlinkDomain) Если для проекта определено несколько пользовательских динамических доменов для ссылок, укажите, какой из них следует использовать при открытии ссылки с помощью указанного мобильного приложения (например,example.page.link). В противном случае автоматически выбирается первый домен.linkDomain: Необязательный пользовательский домен Firebase Hosting, используемый при открытии ссылки с помощью указанного мобильного приложения. Домен должен быть настроен в Firebase Hosting и принадлежать проекту. Это не может быть домен хостинга по умолчанию (web.appилиfirebaseapp.com). Эта настройка заменяет устаревшую настройкуdynamicLinkDomain.
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 Dynamic Links устарела; теперь для отправки ссылки для входа используется Firebase Hosting. Для настройки под конкретную платформу следуйте инструкциям в руководстве:
Подтвердите ссылку в электронном письме и войдите в систему.
Для завершения авторизации через мобильное приложение необходимо настроить его таким образом, чтобы оно обнаруживало входящую ссылку приложения, анализировало лежащую в её основе прямую ссылку и затем завершало авторизацию.
В обработчике ссылок проверьте, предназначена ли ссылка для аутентификации по электронной почте, и если да, завершите процесс входа в систему.
// 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.");
}
Однако, поскольку процесс может завершиться на другом устройстве, где исходный пользователь не авторизован, он может не завершиться. В этом случае пользователю может быть показано сообщение об ошибке, чтобы заставить его открыть ссылку на том же устройстве. В ссылку можно передать информацию о типе операции и идентификаторе пользователя (uid).
Устарело: Различение пароля электронной почты и ссылки в электронном письме.
Если вы создали свой проект 15 сентября 2023 года или позже, защита от перечисления адресов электронной почты включена по умолчанию. Эта функция повышает безопасность учетных записей пользователей вашего проекта, но отключает метод fetchSignInMethodsForEmail() , который мы ранее рекомендовали для реализации потоков, основанных на идентификаторах.
Хотя вы можете отключить защиту от перечисления адресов электронной почты для своего проекта, мы не рекомендуем этого делать.
Для получения более подробной информации см. документацию по защите от перечисления адресов электронной почты .
Следующие шаги
После создания пользователем новой учетной записи, она сохраняется как часть вашего проекта Firebase и может использоваться для идентификации пользователя во всех приложениях вашего проекта, независимо от того, какой способ входа в систему использовал пользователь.
В ваших приложениях вы можете получить основную информацию профиля пользователя из объекта User . См. раздел «Управление пользователями» .
В правилах безопасности Firebase Realtime Database и Cloud Storage вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной auth и использовать его для управления доступом пользователя к данным.
Вы можете разрешить пользователям входить в ваше приложение, используя несколько поставщиков аутентификации, связав учетные данные поставщика аутентификации с существующей учетной записью пользователя.
Для выхода пользователя из системы вызовите signOut() :
await FirebaseAuth.instance.signOut();