Вы можете использовать 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:34.19.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:22.0.0") }Благодаря Firebase Android BoM в вашем приложении всегда будут использоваться совместимые версии библиотек Firebase Android.
(Альтернативный вариант.) Добавьте зависимости библиотеки 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:24.2.0")
// Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:22.0.0") }
Как включить вход по ссылке в проекте Firebase
Чтобы пользователи могли входить в аккаунт по ссылке, отправленной на электронную почту, сначала включите поставщика "Электронная почта" и метод входа "Ссылка на электронную почту" для своего проекта Firebase:
В консоли Firebase выберите Безопасность > Аутентификация.
На вкладке Sign-in method (Способ входа) включите поставщика услуг входа Email/Password (Электронная почта/Пароль). Обратите внимание, что для входа по ссылке необходимо включить вход с использованием адреса электронной почты и пароля.
В том же разделе включите поставщика Ссылка на электронную почту (вход без пароля).
Нажмите Сохранить.
Отправка ссылки для аутентификации на адрес электронной почты пользователя
Чтобы запустить процесс аутентификации, предложите пользователю ввести адрес электронной почты и вызовите функцию sendSignInLinkToEmail, чтобы Firebase отправил ссылку для аутентификации на указанный адрес.
Создайте объект ActionCodeSettings, который содержит инструкции для Firebase о том, как создать ссылку в электронном письме. Задайте следующие поля:
url– ссылка на контент, которую нужно встроить, и любые дополнительные данные, которые нужно передать. Если вы ещё не добавили домен ссылки в список авторизованных доменов, сделайте это:В консоли Firebase выберите Безопасность > Аутентификация > вкладка Настройки.
В разделе Авторизованные домены нажмите Добавить домен и добавьте домен ссылки.
Если приложение не установлено на устройстве пользователя и его не удалось установить, ссылка перенаправит пользователя на этот URL.
androidPackageNameиiOSBundleId: помогают Firebase Authentication определить, нужно ли создавать ссылку только для сайта или ссылку для мобильного устройства, которая открывается на устройстве Android или Apple.handleCodeInApp– задайте значение true. В отличие от других действий, выполняемых вне приложения (например, сброса пароля и подтверждения адреса электронной почты), вход в аккаунт всегда должен осуществляться в приложении. Это связано с тем, что в конце процесса пользователь должен войти в аккаунт, а состояние аутентификации должно сохраниться в приложении.linkDomain: если для проекта определены специальные домены ссылок Hosting, укажите, какой из них следует использовать, когда ссылка открывается в определенном мобильном приложении. В противном случае автоматически выбирается домен по умолчанию (например, ).PROJECT_ID.firebaseapp.comdynamicLinkDomain: поддержка прекращена. Не указывайте этот параметр.
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 версии 23.2.0 или более поздней и Firebase BoM версии 33.9.0 или более поздней.
Если в вашем приложении используются ссылки старого типа, перейдите на новую систему, основанную на Firebase Hosting.
Устарело: различие между адресом электронной почты и паролем и ссылкой для входа
Если вы создали проект 15 сентября 2023 г. или позже, защита от перечисления адресов электронной почты включена по умолчанию. Эта функция повышает безопасность аккаунтов пользователей проекта, но отключает метод fetchSignInMethodsForEmail(), который мы ранее рекомендовали для реализации потоков с идентификатором.
Хотя вы можете отключить защиту от перечисления адресов электронной почты для своего проекта, мы не рекомендуем этого делать.
Подробная информация приведена в документации по защите от перечисления адресов электронной почты.
Дальнейшие действия
После первого входа пользователя создается новый аккаунт, связанный с учетными данными, которые он использовал (именем пользователя и паролем, номером телефона или информацией поставщика услуг аутентификации). Этот новый аккаунт хранится в проекте Firebase и позволяет идентифицировать пользователя во всех приложениях проекта независимо от того, как он вошел в аккаунт.
-
В своих приложениях вы можете получить основную информацию профиля пользователя из объекта
FirebaseUser. Подробнее о том, как управлять пользователями… В Firebase Realtime Database и Cloud Storage правилах безопасности можно получить уникальный идентификатор пользователя, выполнившего вход, из переменной
authи использовать его, чтобы контролировать, к каким данным у пользователя есть доступ.
Вы можете разрешить пользователям входить в ваше приложение, используя несколько поставщиков услуг аутентификации, связав учетные данные поставщика услуг аутентификации с существующим аккаунтом пользователя.
Чтобы выйти из аккаунта пользователя, вызовите функцию
signOut:
Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();