Вы можете использовать Firebase Authentication для входа пользователя, отправив ему электронное письмо, содержащее ссылку, по которой он может щелкнуть, чтобы войти в систему. При этом также проверяется адрес электронной почты пользователя.
Вход в систему по электронной почте имеет множество преимуществ:
- Простая регистрация и вход.
- Снижение риска повторного использования паролей в приложениях, что может подорвать безопасность даже правильно выбранных паролей.
- Возможность аутентификации пользователя, а также проверка того, что пользователь является законным владельцем адреса электронной почты.
- Для входа в систему пользователю требуется только доступная учетная запись электронной почты. Никакого владения номером телефона или учетной записью в социальной сети не требуется.
- Пользователь может безопасно войти в систему без необходимости вводить (или запоминать) пароль, который может быть затруднительным на мобильном устройстве.
- Существующего пользователя, который ранее входил в систему с помощью идентификатора электронной почты (пароля или федеративного), можно обновить, чтобы он входил в систему только с помощью электронной почты. Например, пользователь, забывший свой пароль, все равно может войти в систему без необходимости его сброса.
Прежде чем начать
Настройте свой Android-проект
Если вы еще этого не сделали, добавьте Firebase в свой проект Android .
В файле Gradle вашего модуля (на уровне приложения) (обычно
<project>/<app-module>/build.gradle.kts
или<project>/<app-module>/build.gradle
) добавьте зависимость для библиотеки Firebase Authentication для Android. Мы рекомендуем использовать Firebase Android BoM для управления версиями библиотеки.Кроме того, в рамках настройки Firebase Authentication вам необходимо добавить в свое приложение SDK сервисов Google Play.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:33.8.0")) // Add the dependency for the Firebase Authentication library // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-auth")
// Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.3.0") }Используя Firebase Android BoM , ваше приложение всегда будет использовать совместимые версии библиотек Firebase Android.
Ищете библиотечный модуль, специфичный для Kotlin? Начиная с октября 2023 года ( Firebase BoM 32.5.0) от основного модуля библиотеки могут зависеть как разработчики Kotlin, так и Java (подробнее см. FAQ по этой инициативе ).(Альтернатива) Добавить зависимости библиотеки Firebase без использования BoM
Если вы решите не использовать Firebase BoM , вы должны указать каждую версию библиотеки Firebase в ее строке зависимости.
Обратите внимание: если вы используете в своем приложении несколько библиотек Firebase, мы настоятельно рекомендуем использовать BoM для управления версиями библиотек, что гарантирует совместимость всех версий.
dependencies { // Add the dependency for the Firebase Authentication library // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-auth:23.1.0")
// Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.3.0") }
Включите вход по электронной почте для вашего проекта Firebase
Чтобы войти в систему по ссылке электронной почты, сначала необходимо включить поставщика электронной почты и метод входа по ссылке электронной почты для вашего проекта Firebase:
- В консоли Firebase откройте раздел Auth .
- На вкладке «Метод входа » включите поставщика электронной почты и пароля . Обратите внимание, что для использования входа по ссылке электронной почты необходимо включить вход по электронной почте и паролю.
- В том же разделе включите метод входа по ссылке электронной почты (вход без пароля) .
- Нажмите Сохранить .
Отправьте ссылку для аутентификации на адрес электронной почты пользователя.
Чтобы инициировать процесс аутентификации, предоставьте пользователю интерфейс, который предложит пользователю указать свой адрес электронной почты, а затем вызовите sendSignInLinkToEmail
, чтобы запросить у Firebase ссылку для аутентификации на электронную почту пользователя.
Создайте объект ActionCodeSettings , который предоставляет Firebase инструкции по созданию ссылки электронной почты. Задайте следующие поля:
-
url
: глубокая ссылка для встраивания и любое дополнительное состояние, которое необходимо передать. Домен ссылки должен быть внесен в белый список авторизованных доменов консоли Firebase, который можно найти, перейдя на вкладку «Метод входа» (Аутентификация -> Метод входа). Ссылка перенаправит пользователя на этот URL-адрес, если приложение не установлено на его устройстве и его не удалось установить. -
androidPackageName
иiOSBundleId
: помогают Firebase Authentication определить, следует ли создавать ссылку только для Интернета или для мобильных устройств, которая открывается на устройстве Android или Apple. -
handleCodeInApp
: установлено значение true. Операцию входа в систему всегда необходимо выполнять в приложении, в отличие от других внешних действий с электронной почтой (сброс пароля и проверка электронной почты). Это связано с тем, что в конце потока ожидается, что пользователь войдет в систему, и его состояние аутентификации сохранится в приложении. -
linkDomain
: если для проекта определены пользовательские домены ссылок Hosting , укажите, какой из них использовать, когда ссылка должна открываться указанным мобильным приложением. В противном случае автоматически выбирается домен по умолчанию (например,PROJECT_ID .firebaseapp.com
). -
dynamicLinkDomain
: устарел. Не указывайте этот параметр.
Kotlin
val actionCodeSettings = 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 setIOSBundleId("com.example.ios") setAndroidPackageName( "com.example.android", true, // installIfNotAvailable "12", // minimumVersion ) }
Java
ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder() // URL you want to redirect back to. The domain (www.example.com) for this // URL must be whitelisted in the Firebase Console. .setUrl("https://www.example.com/finishSignUp?cartId=1234") // This must be true .setHandleCodeInApp(true) .setIOSBundleId("com.example.ios") .setAndroidPackageName( "com.example.android", true, /* installIfNotAvailable */ "12" /* minimumVersion */) .build();
Дополнительные сведения о настройках ActionCodeSettings см. в разделе « Состояние передачи в действиях по электронной почте» .
-
Попросите пользователя указать адрес электронной почты.
Отправьте ссылку для аутентификации на адрес электронной почты пользователя и сохраните адрес электронной почты пользователя на случай, если пользователь завершит вход в систему по электронной почте на том же устройстве.
Kotlin
Firebase.auth.sendSignInLinkToEmail(email, actionCodeSettings) .addOnCompleteListener { task -> if (task.isSuccessful) { Log.d(TAG, "Email sent.") } }
Java
FirebaseAuth auth = FirebaseAuth.getInstance(); auth.sendSignInLinkToEmail(email, actionCodeSettings) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Log.d(TAG, "Email sent."); } } });
Завершите вход по ссылке электронной почты.
Проблемы безопасности
Чтобы предотвратить использование ссылки для входа в систему в качестве непредусмотренного пользователя или на непредусмотренном устройстве, Firebase Authentication требует предоставления адреса электронной почты пользователя при завершении процесса входа в систему. Чтобы вход прошел успешно, этот адрес электронной почты должен совпадать с адресом, на который изначально была отправлена ссылка для входа.
Вы можете упростить этот процесс для пользователей, которые открывают ссылку для входа на том же устройстве, на котором они запрашивают ссылку, сохраняя их адрес электронной почты локально (например, с помощью SharedPreferences) при отправке электронного письма для входа. Затем используйте этот адрес для завершения потока. Не передавайте адрес электронной почты пользователя в параметрах URL-адреса перенаправления и не используйте его повторно, поскольку это может активировать внедрение сеансов.
После завершения входа в систему все предыдущие непроверенные механизмы входа будут удалены у пользователя, а все существующие сеансы будут признаны недействительными. Например, если кто-то ранее создал неподтвержденную учетную запись с тем же адресом электронной почты и паролем, пароль пользователя будет удален, чтобы предотвратить повторный вход в систему с непроверенным адресом электронной почты и паролем двойнику, заявившему право собственности и создавшему эту неподтвержденную учетную запись.
Также убедитесь, что вы используете URL-адрес HTTPS в производстве, чтобы избежать потенциального перехвата вашей ссылки промежуточными серверами.
Завершение входа в приложение Android
Firebase Authentication использует Firebase Hosting для отправки ссылки по электронной почте на мобильное устройство. Для завершения входа через мобильное приложение приложение должно быть настроено на обнаружение входящей ссылки приложения, анализ базовой глубокой ссылки и затем завершение входа. Дополнительную информацию см. в документации по ссылкам на приложения Android .
Настройка Firebase Hosting
Firebase Authentication использует домены Firebase Hosting при создании и отправке ссылки, которая должна открываться в мобильном приложении. Домен Firebase Hosting по умолчанию уже настроен для вас.
Настройте домены Firebase Hosting :
В консоли Firebase откройте раздел Хостинг .
Если вы хотите использовать домен по умолчанию для ссылки электронной почты, которая открывается в мобильных приложениях, перейдите на сайт по умолчанию и запишите домен Hosting по умолчанию. Домен Hosting по умолчанию обычно выглядит следующим образом:
PROJECT_ID .firebaseapp.com
.Это значение понадобится вам, когда вы настроите свое приложение для перехвата входящей ссылки.
Если вы хотите использовать собственный домен для ссылки электронной почты, вы можете зарегистрировать его на Firebase Hosting и использовать его в качестве домена ссылки.
Настройка Android-приложений:
Чтобы обрабатывать эти ссылки из вашего приложения Android, имя пакета вашего приложения необходимо указать в настройках проекта консоли Firebase . Кроме того, необходимо предоставить SHA-1 и SHA-256 сертификата приложения.
Если вы хотите, чтобы эти ссылки перенаправлялись на определенное действие, вам необходимо настроить фильтр намерений в файле
AndroidManifest.xml
. Фильтр намерений должен улавливать ссылки электронной почты вашего домена. ВAndroidManifest.xml
:<intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="https" android:host="<PROJECT_ID>.firebaseapp.com or your custom domain" android:pathPrefix="/__/auth/links" /> </intent-filter>
Когда пользователи открывают ссылку на хостинг с путем
/__/auth/links
и указанной вами схемой и хостом, ваше приложение начнет действие с этим фильтром намерений для обработки ссылки .
Подтвердите ссылку и войдите в систему
После получения ссылки, как описано выше, убедитесь, что она предназначена для аутентификации по ссылке электронной почты, и завершите вход.
Kotlin
val auth = Firebase.auth val intent = intent val emailLink = intent.data.toString() // Confirm the link is a sign-in with email link. if (auth.isSignInWithEmailLink(emailLink)) { // Retrieve this from wherever you stored it val email = "someemail@domain.com" // The client SDK will parse the code from the link for you. auth.signInWithEmailLink(email, emailLink) .addOnCompleteListener { task -> if (task.isSuccessful) { Log.d(TAG, "Successfully signed in with email link!") val result = task.result // You can access the new user via result.getUser() // Additional user info profile *not* available via: // result.getAdditionalUserInfo().getProfile() == null // You can check if the user is new or existing: // result.getAdditionalUserInfo().isNewUser() } else { Log.e(TAG, "Error signing in with email link", task.exception) } } }
Java
FirebaseAuth auth = FirebaseAuth.getInstance(); Intent intent = getIntent(); String emailLink = intent.getData().toString(); // Confirm the link is a sign-in with email link. if (auth.isSignInWithEmailLink(emailLink)) { // Retrieve this from wherever you stored it String email = "someemail@domain.com"; // The client SDK will parse the code from the link for you. auth.signInWithEmailLink(email, emailLink) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { Log.d(TAG, "Successfully signed in with email link!"); AuthResult result = task.getResult(); // You can access the new user via result.getUser() // Additional user info profile *not* available via: // result.getAdditionalUserInfo().getProfile() == null // You can check if the user is new or existing: // result.getAdditionalUserInfo().isNewUser() } else { Log.e(TAG, "Error signing in with email link", task.getException()); } } }); }
Дополнительные сведения о том, как выполнять вход по ссылке электронной почты в приложении Apple, см. в руководстве по платформам Apple .
Чтобы узнать, как обрабатывать вход по ссылке электронной почты в веб-приложении, обратитесь к веб-руководству .
Привязка/повторная аутентификация по ссылке электронной почты
Вы также можете связать этот метод аутентификации с существующим пользователем. Например, пользователь, ранее прошедший аутентификацию у другого провайдера, например по номеру телефона, может добавить этот метод входа в свою существующую учетную запись.
Разница будет во второй половине операции:
Kotlin
// Construct the email link credential from the current URL. val credential = EmailAuthProvider.getCredentialWithLink(email, emailLink) // Link the credential to the current user. Firebase.auth.currentUser!!.linkWithCredential(credential) .addOnCompleteListener { task -> if (task.isSuccessful) { Log.d(TAG, "Successfully linked emailLink credential!") val result = task.result // You can access the new user via result.getUser() // Additional user info profile *not* available via: // result.getAdditionalUserInfo().getProfile() == null // You can check if the user is new or existing: // result.getAdditionalUserInfo().isNewUser() } else { Log.e(TAG, "Error linking emailLink credential", task.exception) } }
Java
// Construct the email link credential from the current URL. AuthCredential credential = EmailAuthProvider.getCredentialWithLink(email, emailLink); // Link the credential to the current user. auth.getCurrentUser().linkWithCredential(credential) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { Log.d(TAG, "Successfully linked emailLink credential!"); AuthResult result = task.getResult(); // You can access the new user via result.getUser() // Additional user info profile *not* available via: // result.getAdditionalUserInfo().getProfile() == null // You can check if the user is new or existing: // result.getAdditionalUserInfo().isNewUser() } else { Log.e(TAG, "Error linking emailLink credential", task.getException()); } } });
Это также можно использовать для повторной аутентификации пользователя ссылки электронной почты перед выполнением конфиденциальной операции.
Kotlin
// Construct the email link credential from the current URL. val credential = EmailAuthProvider.getCredentialWithLink(email, emailLink) // Re-authenticate the user with this credential. Firebase.auth.currentUser!!.reauthenticateAndRetrieveData(credential) .addOnCompleteListener { task -> if (task.isSuccessful) { // User is now successfully reauthenticated } else { Log.e(TAG, "Error reauthenticating", task.exception) } }
Java
// Construct the email link credential from the current URL. AuthCredential credential = EmailAuthProvider.getCredentialWithLink(email, emailLink); // Re-authenticate the user with this credential. auth.getCurrentUser().reauthenticateAndRetrieveData(credential) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { // User is now successfully reauthenticated } else { Log.e(TAG, "Error reauthenticating", task.getException()); } } });
Однако, поскольку поток может оказаться на другом устройстве, где исходный пользователь не вошел в систему, этот поток может не быть завершен. В этом случае пользователю может быть показано сообщение об ошибке, чтобы заставить его открыть ссылку на том же устройстве. В ссылке можно передать некоторое состояние, чтобы предоставить информацию о типе операции и идентификаторе пользователя.
Устарело: проверка на основе Firebase Dynamic Links
Аутентификация по ссылке электронной почты ранее основывалась на Firebase Dynamic Links , которая будет отключена 25 августа 2025 года .
Мы опубликовали альтернативное решение в Firebase Authentication Android SDK v23.2.0+ и Firebase BoM v33.9.0+.
Если ваше приложение использует ссылки старого стиля, вам следует перенести свое приложение на новую систему на основе Firebase Hosting .
Устарело: отличие пароля электронной почты от ссылки электронной почты.
Если вы создали свой проект 15 сентября 2023 г. или позднее, защита перечисления электронной почты включена по умолчанию. Эта функция повышает безопасность учетных записей пользователей вашего проекта, но отключает метод fetchSignInMethodsForEmail()
, который мы ранее рекомендовали для реализации потоков с приоритетом идентификаторов.
Хотя вы можете отключить защиту перечисления электронной почты для своего проекта, мы не рекомендуем этого делать.
Дополнительные сведения см. в документации по защите перечисления электронной почты .
Следующие шаги
После того, как пользователь входит в систему в первый раз, создается новая учетная запись пользователя, которая связывается с учетными данными (то есть именем пользователя и паролем, номером телефона или информацией поставщика аутентификации), с которыми пользователь вошел в систему. Эта новая учетная запись хранится как часть вашего проекта Firebase и может использоваться для идентификации пользователя в каждом приложении вашего проекта, независимо от того, как пользователь входит в систему.
В ваших приложениях вы можете получить базовую информацию профиля пользователя из объекта
FirebaseUser
. См. Управление пользователями .В правилах безопасности базы данных реального времени и Cloud Storage Firebase Realtime Database вы можете получить уникальный идентификатор пользователя, вошедшего в систему, из переменной
auth
и использовать его для управления тем, к каким данным пользователь может получить доступ.
Вы можете разрешить пользователям входить в ваше приложение с использованием нескольких поставщиков аутентификации, связав учетные данные поставщика аутентификации с существующей учетной записью пользователя.
Чтобы выйти из системы, вызовите signOut
:
Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();