Firebase Authentication'ı kullanarak bir kullanıcıya, oturum açmak için tıklayabileceği bağlantı içeren bir e-posta göndererek oturum açabilirsiniz. Bu işlemde, kullanıcının e-posta adresi de doğrulanır.
E-posta ile oturum açmanın pek çok avantajı vardır:
- Kayıt ve oturum açma işlemlerini kolaylaştırın.
- Şifrelerin uygulamalarda yeniden kullanılma riski daha düşüktür. Bu durum, iyi seçilmiş şifrelerin bile güvenliğini tehlikeye atabilir.
- Bir kullanıcının kimliğini doğrularken aynı zamanda kullanıcının bir e-posta adresinin meşru sahibi olduğunu doğrulayabilme.
- Kullanıcının oturum açmak için yalnızca erişilebilir bir e-posta hesabına ihtiyacı vardır. Telefon numarasının veya sosyal medya hesabının sahibi olmanız gerekmez.
- Kullanıcılar, şifre sağlamalarına (veya hatırlamalarına) gerek kalmadan güvenli bir şekilde oturum açabilir. Bu da mobil cihazların çalışmasını zorlaştırabilir.
- Daha önce e-posta tanımlayıcısı (şifre veya birleşik) ile oturum açmış olan mevcut bir kullanıcı, yalnızca e-posta adresiyle oturum açacak şekilde yükseltilebilir. Örneğin, şifresini unutan bir kullanıcı, şifresini sıfırlamaya gerek kalmadan oturum açmaya devam edebilir.
Başlamadan önce
Android projenizi oluşturun
Henüz yapmadıysanız Firebase'i Android projenize ekleyin.
Modül (uygulama düzeyinde) Gradle dosyanıza (genellikle
<project>/<app-module>/build.gradle.kts
veya<project>/<app-module>/build.gradle
), Android için Firebase Authentication kitaplığına bağımlılığı ekleyin. Kitaplık sürümünü kontrol etmek için Firebase Android BoM'u kullanmanızı öneririz.Ayrıca, Firebase Authentication'ı kurmanın bir parçası olarak Google Play Hizmetleri SDK'sını uygulamanıza eklemeniz gerekir.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:33.1.2")) // 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.2.0") }Firebase Android BoM kullanıldığında uygulamanız Firebase Android kitaplıklarının her zaman uyumlu sürümlerini kullanır.
(Alternatif) BoM'u kullanmadan Firebase kitaplığı bağımlılıklarını ekleme
Firebase BoM'yi kullanmamayı seçerseniz her Firebase kitaplığı sürümünü bağımlılık satırında belirtmeniz gerekir.
Uygulamanızda birden fazla Firebase kitaplığı kullanıyorsanız kitaplık sürümlerini yönetmek için BoM kullanmanızı önemle tavsiye ederiz. Böylece tüm sürümlerin uyumlu olması sağlanır.
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.0.0")
// Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.2.0") }
Firebase projeniz için E-posta Bağlantısıyla oturum açma özelliğini etkinleştirme
Kullanıcıların e-posta bağlantısıyla oturum açmasını sağlamak için önce Firebase projenizde E-posta sağlayıcı ve E-posta bağlantısı oturum açma yöntemini etkinleştirmeniz gerekir:
- Firebase konsolunda Auth bölümünü açın.
- Oturum açma yöntemi sekmesinde, E-posta/Şifre sağlayıcısını etkinleştirin. E-posta bağlantısıyla oturum açmayı kullanmak için e-posta/şifre ile oturum açma özelliğinin etkinleştirilmesi gerektiğini unutmayın.
- Aynı bölümde, E-posta bağlantısı (şifresiz oturum açma) oturum açma yöntemini etkinleştirin.
- Kaydet'i tıklayın.
Kullanıcının e-posta adresine bir kimlik doğrulama bağlantısı gönderin
Kimlik doğrulama akışını başlatmak için kullanıcıya, e-posta adresini girmesini isteyen bir arayüz sunun. Ardından, Firebase'in kimlik doğrulama bağlantısını kullanıcının e-postasına göndermesini istemek için sendSignInLinkToEmail
numaralı telefonu arayın.
Firebase'e e-posta bağlantısının nasıl oluşturulacağıyla ilgili talimatları sağlayan ActionCodeSettings nesnesini oluşturun. Aşağıdaki alanları ayarlayın:
url
: Yerleştirilecek derin bağlantı ve iletilecek ek durum. Bağlantının alan adı, Firebase Konsolu'ndaki yetkili alanlar listesinde beyaz listeye eklenmiş olmalıdır. Bu alana, Oturum açma yöntemi sekmesine (Kimlik Doğrulama -> Oturum açma yöntemi) gidilerek ulaşabilirsiniz. Uygulama cihazında yüklü değilse ve uygulama yüklenemiyorsa bağlantı, kullanıcıyı bu URL'ye yönlendirir.androidPackageName
veIOSBundleId
: Bir Android veya Apple cihazda oturum açma bağlantısı açıldığında kullanılacak uygulamalar. Mobil uygulamalar aracılığıyla e-posta işlem bağlantılarını açmak için Firebase Dynamic Links'i yapılandırma hakkında daha fazla bilgi edinin.handleCodeInApp
: Doğru değerine ayarlanır. Oturum açma işleminin, diğer bant dışı e-posta işlemlerinin (şifre sıfırlama ve e-posta doğrulamaları) aksine her zaman uygulamada tamamlanması gerekir. Bunun nedeni, akışın sonunda kullanıcının oturum açmasının beklendiği ve Yetkilendirme durumunun uygulama içinde devam ediyor olmasıdır.dynamicLinkDomain
: Bir proje için birden fazla özel dinamik bağlantı alan adı tanımlandığında, bağlantı belirtilen bir mobil uygulama üzerinden açılacağında hangisinin kullanılacağını belirtin (ör.example.page.link
). Aksi takdirde ilk alan otomatik olarak seçilir.
Kotlin+KTX
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 hakkında daha fazla bilgi edinmek için E-posta İşlemlerinde Geçiş Durumu bölümüne bakın.
Kullanıcıdan e-posta adresini isteyin.
Kimlik doğrulama bağlantısını kullanıcının e-posta adresine gönderin ve kullanıcının e-posta oturum açma işlemini aynı cihazda tamamlaması ihtimaline karşı kullanıcının e-postasını kaydedin.
Kotlin+KTX
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."); } } });
E-posta bağlantısıyla oturum açma işlemini tamamlayın
Güvenlikle ilgili sorunlar
Oturum açma bağlantısının istenmeyen bir kullanıcı olarak veya istenmeyen bir cihazda oturum açmak için kullanılmasını önlemek amacıyla Firebase Auth, oturum açma akışı tamamlanırken kullanıcının e-posta adresinin sağlanmasını zorunlu kılar. Oturum açmanın başarılı olması için bu e-posta adresi, oturum açma bağlantısının ilk gönderildiği adresle eşleşmelidir.
Oturum açma bağlantısını istedikleri cihazda açan kullanıcılar için bu akışı, oturum açma e-postası gönderdiğinizde e-posta adreslerini yerel olarak (örneğin, SharedPreferences kullanarak) depolayarak daha verimli hale getirebilirsiniz. Ardından, akışı tamamlamak için bu adresi kullanın. Kullanıcının e-postasını, yönlendirme URL'si parametrelerinde iletmeyin ve yeniden kullanmayın. Aksi takdirde, oturum yerleştirme etkinleştirilebilir.
Oturum açma işlemi tamamlandıktan sonra, önceki doğrulanmamış tüm oturum açma mekanizmaları kullanıcıdan kaldırılır ve mevcut oturumlar geçersiz kılınır. Örneğin, daha önce aynı e-posta adresi ve şifreyle doğrulanmamış bir hesap oluşturulduysa hesabın sahibi olduğunu iddia eden ve bu doğrulanmamış hesabı oluşturan kimliğe bürünen kullanıcının doğrulanmamış e-posta ve şifreyle tekrar oturum açmasını önlemek için kullanıcının şifresi kaldırılır.
Ayrıca, bağlantınızın ara sunucular tarafından ele geçirilmesini önlemek için üretimde HTTPS URL'si kullandığınızdan emin olun.
Bir Android uygulamasında oturum açma işlemini tamamlama
Firebase Authentication, e-posta bağlantısını bir mobil cihaza göndermek için Firebase Dynamic Links'i kullanır. Oturum açma işlemini mobil uygulama üzerinden tamamlamak için uygulamanın, gelen uygulama bağlantısını algılayacak, temel derin bağlantıyı ayrıştıracak ve ardından oturum açma işlemini tamamlayacak şekilde yapılandırılması gerekir.
Firebase Dynamic Links'i yapılandırma
Firebase Auth, mobil uygulamada açılması amaçlanan bir bağlantı gönderirken Firebase Dynamic Links'i kullanır. Bu özelliği kullanmak için Firebase Konsolu'nda Dinamik Bağlantıların yapılandırılması gerekir.
Firebase Dynamic Links'i etkinleştirin:
- Firebase konsolunda Dinamik Bağlantılar bölümünü açın.
-
Henüz Dynamic Links şartlarını kabul etmediyseniz ve bir Dynamic Links alan adı oluşturmadıysanız bunu hemen yapın.
Daha önce bir Dynamic Links alan oluşturduysanız bunu not edin. Dynamic Links alan adı genellikle aşağıdaki örnek gibi görünür:
example.page.link
Apple veya Android uygulamanızı gelen bağlantıya müdahale edecek şekilde yapılandırırken bu değere ihtiyacınız olacaktır.
Android uygulamalarını yapılandırma:
- Bu bağlantıları Android uygulamanızdan işleyebilmek için Firebase Konsolu proje ayarlarında Android paket adının belirtilmesi gerekir. Ayrıca, uygulama sertifikasının SHA-1 ve SHA-256'sının sağlanması gerekir.
- Artık dinamik bağlantı alan adı eklediğinize ve Android uygulamanızın doğru yapılandırıldığından emin olduğunuza göre, dinamik bağlantı başlatıcı etkinliğinden başlayarak uygulamanıza yönlendirilecek.
- Dinamik bağlantının belirli bir etkinliğe yönlendirmesini istiyorsanız AndroidManifest.xml dosyanızda bir intent filtresi yapılandırmanız gerekir. Bu, dinamik bağlantı alan adınızı veya intent filtresinde e-posta işlem işleyicisini belirterek yapılabilir. Varsayılan olarak e-posta işlem işleyicisi aşağıdaki örnekteki gibi bir alan adında barındırılır:
PROJECT_ID.firebaseapp.com/
- Uyarılar:
- Intent filtrenizdeki actionCodeSettings'de ayarladığınız URL'yi belirtmeyin.
- Dinamik bağlantı alan adınızı oluştururken bir kısa URL bağlantısı da oluşturmuş olabilirsiniz. Bu kısa URL iletilmeyecek. Niyet filtrenizi
android:pathPrefix
özelliğiyle yakalayacak şekilde yapılandırmayın. Bu, uygulamanızın farklı bölümlerinde farklı dinamik bağlantıları yakalayamayacağınız anlamına gelir. Ancak hangi işlemin yapılmaya çalışıldığını görmek için bağlantıdakimode
sorgu parametresini kontrol edebilir veya uygulamanızın aldığı bir bağlantının istediğiniz işlemi yapıp yapmadığını görmek içinisSignInWithEmailLink
gibi SDK yöntemlerini kullanabilirsiniz.
- Dinamik bağlantı alma hakkında daha fazla bilgi için Android Dynamic Links alma talimatlarını inceleyin.
Bağlantıyı doğrula ve oturum aç
Yukarıda açıklandığı şekilde bağlantıyı aldıktan sonra, bu bağlantının e-posta bağlantısı kimlik doğrulaması için olduğunu doğrulayın ve oturum açma işlemini tamamlayın.
Kotlin+KTX
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 uygulamasında e-posta bağlantısıyla oturum açma işleminin nasıl yapılacağı hakkında daha fazla bilgi edinmek için Apple platformları kılavuzuna bakın.
Bir web uygulamasında e-posta bağlantısıyla oturum açma işleminin nasıl yapılacağını öğrenmek için Web rehberine bakın.
E-posta bağlantısıyla bağlantı oluşturma/yeniden kimlik doğrulama
Bu kimlik doğrulama yöntemini mevcut bir kullanıcıya da bağlayabilirsiniz. Örneğin, daha önce başka bir sağlayıcıda (ör. telefon numarası) kimlik doğrulaması yapan bir kullanıcı, bu oturum açma yöntemini mevcut hesabına ekleyebilir.
Fark, işlemin ikinci yarısında olacaktır:
Kotlin+KTX
// 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()); } } });
Bu, hassas bir işlem çalıştırmadan önce e-posta bağlantısı kullanıcısının kimliğini yeniden doğrulamak için de kullanılabilir.
Kotlin+KTX
// 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()); } } });
Ancak akış, asıl kullanıcının giriş yapmadığı farklı bir cihazda tamamlanabileceği için bu akış tamamlanmayabilir. Bu durumda, kullanıcıyı bağlantıyı aynı cihazda açmaya zorlamak için bir hata gösterilebilir. İşlemin türü ve kullanıcı kimliği hakkında bilgi sağlamak için bağlantıda bazı durumlar iletilebilir.
Kullanımdan kaldırıldı: E-posta şifresi ile e-posta bağlantısı ayrılıyor
Projenizi 15 Eylül 2023'te veya sonrasında oluşturduysanız e-posta numaralandırma koruması varsayılan olarak etkindir. Bu özellik, projenizin kullanıcı hesaplarının güvenliğini artırır ancak önceden tanımlayıcı öncelikli akışları uygulamanızı önerdiğimiz fetchSignInMethodsForEmail()
yöntemini devre dışı bırakır.
Projeniz için e-posta numaralandırma korumasını devre dışı bırakabilirsiniz ancak bunu yapmamanızı öneririz.
Daha fazla bilgi için e-posta numaralandırma koruması ile ilgili dokümanlara bakın.
Sonraki adımlar
Bir kullanıcı ilk kez oturum açtıktan sonra yeni bir kullanıcı hesabı oluşturulur ve kullanıcının oturum açtığı kimlik bilgilerine (kullanıcı adı ve şifre, telefon numarası veya kimlik doğrulama sağlayıcı bilgisi) bağlanır. Bu yeni hesap Firebase projenizin bir parçası olarak depolanır ve kullanıcının nasıl oturum açtığından bağımsız olarak projenizdeki her uygulamada kullanıcıyı tanımlamak için kullanılabilir.
-
Uygulamalarınızda kullanıcının temel profil bilgilerini
FirebaseUser
nesnesinden alabilirsiniz. Kullanıcıları Yönetme sayfasına göz atın. Firebase Realtime Database ve Cloud Storage Güvenlik Kurallarınızda, oturum açan kullanıcının benzersiz kullanıcı kimliğini
auth
değişkeninden alabilir ve kullanıcının hangi verilere erişebileceğini kontrol etmek için kullanabilirsiniz.
Kimlik doğrulama sağlayıcı kimlik bilgilerini mevcut bir kullanıcı hesabına bağlayarak kullanıcıların, birden fazla kimlik doğrulama sağlayıcı kullanarak uygulamanızda oturum açmasına izin verebilirsiniz.
Bir kullanıcının oturumunu kapatmak için
signOut
numaralı telefonu arayın:
Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();