Anda dapat menggunakan Firebase Authentication untuk memproses login pengguna dengan mengirimkan email berisi link yang dapat diklik pengguna 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
Gunakan Swift Package Manager untuk menginstal dan mengelola dependensi Firebase.
- Di Xcode, dengan project aplikasi Anda dalam keadaan terbuka, buka File > Add Packages.
- Saat diminta, tambahkan repositori SDK platform Apple Firebase:
- Pilih library Firebase Authentication.
- Tambahkan flag
-ObjC
ke bagian Other Linker Flags pada setelan build target Anda. - Setelah selesai, Xcode akan otomatis mulai me-resolve dan mendownload dependensi Anda di latar belakang.
https://github.com/firebase/firebase-ios-sdk.git
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 sendSignInLink
untuk meminta Firebase mengirimkan link autentikasi ke email pengguna.
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).iOSBundleID
danandroidPackageName
: 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.
Swift
let actionCodeSettings = ActionCodeSettings() actionCodeSettings.url = URL(string: "https://www.example.com") // The sign-in operation has to always be completed in the app. actionCodeSettings.handleCodeInApp = true actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!) actionCodeSettings.setAndroidPackageName("com.example.android", installIfNotAvailable: false, minimumVersion: "12")
Objective-C
FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init]; [actionCodeSettings setURL:[NSURL URLWithString:@"https://www.example.com"]]; // The sign-in operation has to always be completed in the app. actionCodeSettings.handleCodeInApp = YES; [actionCodeSettings setIOSBundleID:[[NSBundle mainBundle] bundleIdentifier]]; [actionCodeSettings setAndroidPackageName:@"com.example.android" installIfNotAvailable:NO minimumVersion:@"12"];
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.
Swift
Auth.auth().sendSignInLink(toEmail: email, actionCodeSettings: actionCodeSettings) { error in // ... if let error = error { self.showMessagePrompt(error.localizedDescription) return } // The link was successfully sent. Inform the user. // Save the email locally so you don't need to ask the user for it again // if they open the link on the same device. UserDefaults.standard.set(email, forKey: "Email") self.showMessagePrompt("Check your email for link") // ... }
Objective-C
[[FIRAuth auth] sendSignInLinkToEmail:email actionCodeSettings:actionCodeSettings completion:^(NSError *_Nullable error) { // ... if (error) { [self showMessagePrompt:error.localizedDescription]; return; } // The link was successfully sent. Inform the user. // Save the email locally so you don't need to ask the user for it again // if they open the link on the same device. [NSUserDefaults.standardUserDefaults setObject:email forKey:@"Email"]; [self showMessagePrompt:@"Check your email for link"]; // ... }];
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 Auth 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 email pengguna secara lokal saat Anda mengirimkan email login. Kemudian, gunakan alamat ini untuk menyelesaikan alur.
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 akun yang sama.
Menyelesaikan proses login di aplikasi seluler Apple
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. Lihat artikel tentang link universal dan domain terkait di iOS untuk mengetahui detail selengkapnya tentang cara melakukannya.
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 Apple:
Anda harus mengonfigurasi domain yang dipilih sebagai Domain Terkait (Associated Domain) untuk link aplikasi. Untuk menyiapkan hak di aplikasi Anda, buka tab Signing & Capabilities target di Xcode dan tambahkan domain Firebase Hosting dari langkah sebelumnya ke kemampuan Domain Terkait (Associated Domain). Jika menggunakan domain Firebase Hosting default, domain ini akan menjadi
.applinks:PROJECT_ID.firebaseapp.com
Lihat Mendukung domain terkait (associated domain) di situs dokumentasi Apple untuk mengetahui informasi selengkapnya.
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.
Swift
if Auth.auth().isSignIn(withEmailLink: link) { Auth.auth().signIn(withEmail: email, link: self.link) { user, error in // ... } }
Objective-C
if ([[FIRAuth auth] isSignInWithEmailLink:link]) { [[FIRAuth auth] signInWithEmail:email link:link completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) { // ... }]; }
Untuk mempelajari cara menangani login dengan link email pada aplikasi Android, lihat Panduan Android.
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:
Swift
let credential = EmailAuthCredential.credential(withEmail:email link:link) Auth.auth().currentUser?.link(with: credential) { authData, error in if (error) { // And error occurred during linking. return } // The provider was successfully linked. // The phone user can now sign in with their phone number or email. }
Objective-C
FIRAuthCredential *credential = [FIREmailAuthProvider credentialWithEmail:email link:link]; [FIRAuth auth].currentUser linkWithCredential:credential completion:^(FIRAuthDataResult *_Nullable result, NSError *_Nullable error) { if (error) { // And error occurred during linking. return; } // The provider was successfully linked. // The phone user can now sign in with their phone number or email. }];
Metode ini juga dapat digunakan untuk mengautentikasi ulang pengguna link email sebelum menjalankan operasi yang sensitif.
Swift
let credential = EmailAuthProvider.credential(withEmail:email link:link) Auth.auth().currentUser?.reauthenticate(with: credential) { authData, error in if (error) { // And error occurred during re-authentication. return } // The user was successfully re-authenticated. }
Objective-C
FIRAuthCredential *credential = [FIREmailAuthCredential credentialWithEmail:email link:link]; [FIRAuth auth].currentUser reauthenticateWithCredential:credential completion:^(FIRAuthDataResult *_Nullable result, NSError *_Nullable error) { if (error) { // And error occurred during re-authentication return; } // The user was successfully re-authenticated. }];
Namun, karena alur login dapat berakhir di perangkat berbeda yang tidak dipakai pengguna aslinya 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
Sebelum Firebase Authentication iOS SDK v11.8.0, fitur login dengan link email mengandalkan Firebase Dynamic Links untuk membuka link login di aplikasi yang benar. Link verifikasi ini tidak digunakan lagi, karena Firebase Dynamic Links akan dihentikan pada 25 Agustus 2025.
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.
Untuk mempelajari lebih lanjut, lihat Mengaktifkan atau menonaktifkan perlindungan enumerasi email.
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
User
. 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.
Agar pengguna logout, panggil signOut:
.
Swift
let firebaseAuth = Auth.auth() do { try firebaseAuth.signOut() } catch let signOutError as NSError { print("Error signing out: %@", signOutError) }
Objective-C
NSError *signOutError; BOOL status = [[FIRAuth auth] signOut:&signOutError]; if (!status) { NSLog(@"Error signing out: %@", signOutError); return; }
Anda juga dapat menambahkan kode penanganan error untuk berbagai error autentikasi. Lihat Menangani Error.