Anda dapat menggunakan Firebase Authentication untuk membuat pengguna login dengan mengirimkan email yang berisi link, yang dapat mereka klik untuk login. Dalam prosesnya, alamat email pengguna juga akan diverifikasi.
Ada banyak manfaat login dengan email:
- Proses pendaftaran dan login lebih lancar.
- Risiko penggunaan ulang sandi lintas aplikasi lebih rendah. Penggunaan sandi yang sama dapat mengurangi keamanan, sekalipun sandi sudah dipilih dengan baik.
- Dapat mengautentikasi pengguna, sekaligus memverifikasi bahwa pengguna adalah pemilik sah alamat email.
- Pengguna hanya memerlukan akun email yang dapat diakses untuk login. Tidak diperlukan kepemilikan akun media sosial atau nomor telepon.
- Pengguna dapat login dengan aman tanpa perlu memasukkan (atau mengingat) sandi, yang bisa merepotkan pada perangkat seluler.
- Pengguna yang sudah ada dan pernah login dengan ID email (sandi atau penyedia identitas gabungan) dapat diupgrade agar bisa login dengan email saja. Misalnya, pengguna yang lupa sandi masih dapat login tanpa perlu mereset sandinya.
Sebelum memulai
Menyiapkan project Android Anda
Tambahkan Firebase ke project Android jika Anda belum melakukannya.
Dalam file Gradle modul (level aplikasi) (biasanya
<project>/<app-module>/build.gradle.kts
atau<project>/<app-module>/build.gradle
), tambahkan dependensi untuk library Firebase Authentication untuk Android. Sebaiknya gunakan Firebase Android BoM untuk mengontrol pembuatan versi library.Selain itu, sebagai bagian dari penyiapan Firebase Authentication, Anda perlu menambahkan SDK layanan Google Play ke aplikasi Anda.
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") }Dengan menggunakan Firebase Android BoM, aplikasi Anda akan selalu menggunakan versi library Android Firebase yang kompatibel.
(Alternatif) Tambahkan dependensi library Firebase tanpa menggunakan BoM
Jika memilih untuk tidak menggunakan Firebase BoM, Anda harus menentukan setiap versi library Firebase di baris dependensinya.
Perlu diperhatikan bahwa jika Anda menggunakan beberapa library Firebase di aplikasi, sebaiknya gunakan BoM untuk mengelola versi library, yang memastikan bahwa semua versi kompatibel.
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") }
Mengaktifkan metode login dengan Link Email untuk project Firebase
Untuk memproses login pengguna melalui link email, Anda harus terlebih dahulu mengaktifkan metode login dengan Link email dan Penyedia email untuk project Firebase Anda:
- Di Firebase console, buka bagian Auth.
- Pada tab Sign-in method, aktifkan penyedia Email/Password. Perlu diketahui bahwa login dengan email/sandi harus diaktifkan untuk menggunakan metode login dengan link email.
- Di bagian yang sama, aktifkan metode login dengan Email link (passwordless sign-in).
- Klik Save.
Mengirim link autentikasi ke alamat email pengguna
Untuk memulai alur autentikasi, tampilkan antarmuka
yang akan meminta pengguna memberikan alamat email, lalu panggil
sendSignInLinkToEmail
untuk meminta Firebase mengirimkan link autentikasi ke email pengguna tersebut.
Buat objek ActionCodeSettings yang akan memberi Firebase petunjuk mengenai cara membuat link email. Tetapkan kolom berikut:
url
: Deep link yang akan disematkan dan semua status tambahan yang akan diteruskan. Domain link harus ditambahkan dalam daftar domain yang diizinkan di Firebase Console, yang dapat ditemukan dengan membuka tab Sign-in method (Authentication -> Sign-in method). Link tersebut akan mengalihkan pengguna ke URL ini apabila aplikasi tidak terinstal di perangkat pengguna dan aplikasi tidak dapat diinstal.androidPackageName
daniOSBundleId
: Membantu Firebase Authentication dalam menentukan apakah harus membuat link khusus web atau link seluler yang terbuka di perangkat Android atau Apple.handleCodeInApp
: Tetapkan ke true. Operasi login harus selalu diselesaikan di aplikasi, tidak seperti tindakan email tidak umum yang lain (reset sandi dan verifikasi email). Hal ini perlu dilakukan karena di akhir alur, pengguna diharapkan sudah login dan status Auth-nya tersimpan di dalam aplikasi.linkDomain
: Jika domain link Hosting kustom ditetapkan untuk project, tentukan domain yang akan digunakan saat link dibuka oleh aplikasi seluler yang ditentukan. Jika tidak, domain default akan otomatis dipilih (misalnya, ).PROJECT_ID.firebaseapp.com
dynamicLinkDomain
: Tidak digunakan lagi. Jangan tentukan parameter ini.
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();
Untuk mempelajari ActionCodeSettings lebih lanjut, baca bagian Meneruskan Status dalam Tindakan Email.
Minta pengguna memberikan alamat emailnya.
Kirim link autentikasi ke email pengguna, dan simpan email tersebut untuk berjaga-jaga jika pengguna menyelesaikan proses login dengan email pada perangkat yang sama.
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."); } } });
Menyelesaikan proses login dengan link email
Masalah keamanan
Demi mencegah penggunaan link login untuk login sebagai pengguna yang tidak dimaksud atau pada perangkat yang tidak dimaksud, Firebase Authentication mengharuskan pengguna memasukkan alamat emailnya saat menyelesaikan alur login. Agar proses login berhasil, alamat email ini harus sama dengan alamat yang awalnya dikirimi link login.
Anda dapat menyederhanakan alur ini untuk pengguna yang membuka link login di perangkat yang sama dengan yang digunakan untuk meminta link. Caranya adalah dengan menyimpan alamat emailnya secara lokal, misalnya menggunakan SharedPreferences, saat Anda mengirimkan email login. Kemudian, gunakan alamat ini untuk menyelesaikan alur. Jangan teruskan dan gunakan kembali alamat email pengguna dalam parameter URL alihan karena tindakan ini dapat mengaktifkan injeksi sesi.
Setelah proses login selesai, semua mekanisme login sebelumnya yang tidak diverifikasi akan dihapus dari pengguna dan semua sesi yang ada menjadi tidak valid. Misalnya, jika seseorang sebelumnya menggunakan email dan sandi yang sama untuk membuat akun yang tidak diverifikasi, sandi pengguna tersebut akan dihapus. Dengan begitu, peniru identitas yang mengklaim kepemilikan dan membuat akun yang tidak diverifikasi tersebut tidak akan dapat login lagi dengan email dan sandi yang tidak diverifikasi.
Selain itu, pastikan Anda menggunakan URL HTTPS dalam lingkungan production agar link tidak ditangkap oleh server perantara.
Menyelesaikan proses login di Aplikasi Android
Firebase Authentication menggunakan Firebase Hosting untuk mengirim link email ke perangkat seluler. Untuk menyelesaikan proses login melalui aplikasi seluler, aplikasi harus dikonfigurasi untuk mendeteksi link aplikasi yang masuk, mengurai deep link yang mendasarinya, lalu menyelesaikan proses login. Untuk mempelajari lebih lanjut, lihat dokumentasi Link Aplikasi Android.
Konfigurasi Firebase Hosting
Firebase Authentication menggunakan domain Firebase Hosting saat membuat dan mengirim link yang dimaksudkan untuk dibuka di aplikasi seluler. Domain Firebase Hosting default telah dikonfigurasi untuk Anda.
Konfigurasi domain Firebase Hosting:
Di Firebase console, buka bagian Hosting.
Jika Anda ingin menggunakan domain default untuk link email yang terbuka di aplikasi seluler, buka situs default dan catat domain Hosting default Anda. Domain Hosting default biasanya terlihat seperti ini:
.PROJECT_ID.firebaseapp.com
Anda akan memerlukan nilai ini saat mengonfigurasi aplikasi untuk menangkap link yang masuk.
Jika ingin menggunakan domain kustom untuk link email, Anda dapat mendaftarkannya dengan Firebase Hosting dan menggunakannya untuk domain link.
Mengonfigurasi aplikasi Android:
Untuk menangani link ini dari aplikasi Android, Anda harus menentukan nama paket aplikasi di setelan project Firebase console. Selain itu, SHA-1 dan SHA-256 sertifikat aplikasi harus dimasukkan.
Agar link ini dialihkan ke aktivitas tertentu, Anda harus mengonfigurasi filter intent di file
AndroidManifest.xml
. Filter intent harus menangkap link email domain Anda. DiAndroidManifest.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>
Saat pengguna membuka link hosting dengan jalur
/__/auth/links
serta skema dan host yang Anda tentukan, aplikasi Anda akan memulai aktivitas dengan filter intent ini untuk menangani link.
Memverifikasi link dan login
Setelah Anda menerima link seperti yang dijelaskan di atas, pastikan link tersebut dimaksudkan untuk autentikasi link email dan selesaikan proses login.
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()); } } }); }
Untuk mempelajari lebih lanjut cara menangani proses login dengan link email pada aplikasi Apple, lihat Panduan platform Apple.
Untuk mempelajari cara menangani login dengan link email di aplikasi web, lihat Panduan Web.
Menautkan/mengautentikasi ulang dengan link email
Anda juga dapat menautkan metode autentikasi ini dengan pengguna yang sudah ada. Misalnya, pengguna yang sebelumnya diautentikasi dengan penyedia lain, seperti nomor telepon, dapat menambahkan metode login ini ke akunnya yang sudah ada.
Perbedaannya terletak pada paruh kedua operasi:
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()); } } });
Metode ini juga dapat digunakan untuk mengautentikasi ulang pengguna link email sebelum menjalankan operasi yang sensitif.
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()); } } });
Namun, karena alur ini dapat berakhir di perangkat berbeda yang tidak dipakai pengguna awal untuk login, alur ini mungkin tidak akan diselesaikan. Dalam hal ini, pesan error dapat ditampilkan sehingga pengguna harus membuka link di perangkat yang sama. Beberapa status dapat diteruskan di link untuk memberikan informasi tentang jenis operasi dan UID pengguna.
Tidak digunakan lagi: Verifikasi berbasis Firebase Dynamic Links
Autentikasi link email sebelumnya mengandalkan Firebase Dynamic Links, yang akan dinonaktifkan pada 25 Agustus 2025.
Kami telah memublikasikan solusi alternatif di Firebase Authentication Android SDK v23.2.0+ dan Firebase BoM v33.9.0+.
Jika aplikasi Anda menggunakan link gaya lama, Anda harus memigrasikan aplikasi ke sistem berbasis Firebase Hosting yang baru.
Tidak digunakan lagi: Membedakan email/sandi dengan link email
Jika Anda membuat project pada atau setelah tanggal 15 September 2023, perlindungan enumerasi
email akan diaktifkan secara default. Fitur ini meningkatkan keamanan
akun pengguna project, tetapi menonaktifkan metode fetchSignInMethodsForEmail()
,
yang sebelumnya kami rekomendasikan untuk mengimplementasikan alur yang mendahulukan ID.
Meskipun perlindungan enumerasi email dapat dinonaktifkan di project Anda, sebaiknya Anda tidak melakukannya.
Lihat dokumentasi tentang perlindungan enumerasi email untuk mengetahui detail selengkapnya.
Langkah berikutnya
Setelah pengguna login untuk pertama kalinya, akun pengguna baru akan dibuat dan ditautkan ke kredensial, yaitu nama pengguna dan sandi, nomor telepon, atau informasi penyedia autentikasi, yang digunakan pengguna tersebut untuk login. Akun baru ini disimpan sebagai bagian dari project Firebase Anda, dan dapat digunakan untuk mengidentifikasi pengguna di setiap aplikasi dalam project, terlepas dari cara pengguna login.
-
Di aplikasi, Anda bisa mendapatkan informasi profil dasar pengguna dari objek
FirebaseUser
. Baca bagian Mengelola Pengguna. Di Aturan Keamanan Firebase Realtime Database dan Cloud Storage, Anda bisa mendapatkan ID pengguna unik milik pengguna yang login dari variabel
auth
, dan menggunakannya untuk mengontrol data yang dapat diakses oleh pengguna.
Anda dapat mengizinkan pengguna untuk login ke aplikasi menggunakan beberapa penyedia autentikasi dengan menautkan kredensial penyedia autentikasi ke akun pengguna yang ada.
Untuk memproses logout pengguna, panggil signOut
:
Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();