С помощью 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.9.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.5.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.0.1")
// Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.5.0") }
Включите вход по ссылке из электронной почты для вашего проекта Firebase.
Для авторизации пользователей по ссылке из электронной почты необходимо сначала включить в вашем проекте Firebase поставщика услуг электронной почты и метод авторизации по ссылке из электронной почты:
- В консоли Firebase откройте раздел «Аутентификация» .
- На вкладке «Способ входа» включите поставщик услуг «Электронная почта/Пароль» . Обратите внимание, что для входа по ссылке из электронной почты необходимо включить вход по электронной почте/паролю.
- В этом же разделе включите метод входа по ссылке из электронной почты (вход без пароля) .
- Нажмите « Сохранить ».
Отправить ссылку для аутентификации на электронный адрес пользователя.
Для запуска процесса аутентификации предоставьте пользователю интерфейс, в котором ему будет предложено указать свой адрес электронной почты, а затем вызовите функцию 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()); } } });
Однако, поскольку процесс может завершиться на другом устройстве, где исходный пользователь не авторизован, он может не завершиться. В этом случае пользователю может быть показано сообщение об ошибке, чтобы заставить его открыть ссылку на том же устройстве. В ссылку можно передать информацию о типе операции и идентификаторе пользователя (uid).
Устарело: проверка на основе 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();