Bir kullanıcıya, oturum açmak için tıklayabilecekleri bir bağlantı içeren bir e-posta göndererek oturum açmak için Firebase Authentication'ı kullanabilirsiniz. Bu süreçte, kullanıcının e-posta adresi de doğrulanır.
E-posta ile oturum açmanın sayısız avantajı vardır:
- Düşük sürtünmeli kayıt ve oturum açma.
- Uygulamalar arasında, iyi seçilmiş parolaların bile güvenliğini tehlikeye atabilecek daha düşük parola yeniden kullanım riski.
- Kullanıcının bir e-posta adresinin meşru sahibi olduğunu doğrularken aynı zamanda bir kullanıcının kimliğini doğrulama yeteneği.
- Bir kullanıcının oturum açmak için yalnızca erişilebilir bir e-posta hesabına ihtiyacı vardır. Bir telefon numarasına veya sosyal medya hesabına sahip olmanız gerekmez.
- Bir kullanıcı, bir mobil cihazda külfetli olabilecek bir parola sağlamaya (veya hatırlamaya) gerek kalmadan güvenli bir şekilde oturum açabilir.
- Daha önce bir e-posta tanımlayıcısı (şifre veya birleşik) ile oturum açmış olan mevcut bir kullanıcı, yalnızca e-posta ile oturum açacak şekilde yükseltilebilir. Örneğin, şifresini unutan bir kullanıcı, şifresini sıfırlamak zorunda kalmadan oturum açabilir.
Sen başlamadan önce
Android projenizi kurun
Henüz yapmadıysanız, Firebase'i Android projenize ekleyin .
Modül (uygulama düzeyinde) Gradle dosyanızda (genellikle
<project>/<app-module>/build.gradle.kts
veya<project>/<app-module>/build.gradle
), Firebase Authentication için bağımlılığı ekleyin Android kitaplığı. Kitaplık sürüm oluşturmayı kontrol etmek için Firebase Android BoM'yi kullanmanızı öneririz.Ayrıca Firebase Authentication kurulumunun bir parçası olarak Google Play hizmetleri SDK'sını uygulamanıza eklemeniz gerekir.
Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:32.3.1")) // 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-ktx")
// Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:20.7.0") }Firebase Android BoM'yi kullandığınızda, uygulamanız her zaman Firebase Android kitaplıklarının uyumlu sürümlerini kullanır.
(Alternatif) BoM kullanmadan Firebase kitaplığı bağımlılıkları ekleyin
Firebase BoM'yi kullanmamayı seçerseniz, her bir Firebase kitaplığı sürümünü bağımlılık satırında belirtmeniz gerekir.
Uygulamanızda birden çok Firebase kitaplığı kullanıyorsanız kitaplık sürümlerini yönetmek için tüm sürümlerin uyumlu olmasını sağlayan BoM'yi kullanmanızı kesinlikle öneririz.
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-ktx:22.1.2")
// Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:20.7.0") }Java
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:32.3.1")) // 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:20.7.0") }Firebase Android BoM'yi kullandığınızda, uygulamanız her zaman Firebase Android kitaplıklarının uyumlu sürümlerini kullanır.
(Alternatif) BoM kullanmadan Firebase kitaplığı bağımlılıkları ekleyin
Firebase BoM'yi kullanmamayı seçerseniz, her bir Firebase kitaplığı sürümünü bağımlılık satırında belirtmeniz gerekir.
Uygulamanızda birden çok Firebase kitaplığı kullanıyorsanız kitaplık sürümlerini yönetmek için tüm sürümlerin uyumlu olmasını sağlayan BoM'yi kullanmanızı kesinlikle öneririz.
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:22.1.2")
// Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:20.7.0") }
Firebase projeniz için Email Link oturum açmayı etkinleştirin
Kullanıcıların e-posta bağlantısıyla oturum açması için öncelikle Firebase projeniz için E-posta sağlayıcı ve E-posta bağlantısı oturum açma yöntemini etkinleştirmeniz gerekir:
- Firebase konsolunda Kimlik Doğrulama bölümünü açın.
- Oturum açma yöntemi sekmesinde, E-posta/Parola sağlayıcısını etkinleştirin. E-posta bağlantısı oturum açmayı kullanmak için e-posta/parola oturum açmanın 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, kullanıcıdan e-posta adresini vermesini isteyen bir arayüz sunun ve ardından, Firebase'in kimlik doğrulama bağlantısını kullanıcının e-posta adresine göndermesini istemek için sendSignInLinkToEmail
arayın.
Firebase'e e-posta bağlantısının nasıl oluşturulacağına ilişkin talimatlar sağlayan ActionCodeSettings nesnesini oluşturun. Aşağıdaki alanları ayarlayın:
-
url
: Yerleştirilecek derin bağlantı ve iletilecek herhangi bir ek durum. Bağlantının etki alanı, Oturum açma yöntemi sekmesine (Kimlik Doğrulama -> Oturum açma yöntemi) gidilerek bulunabilen Firebase Konsolu yetkili etki alanları listesinde beyaz listeye alınmalıdır. Uygulama cihazında yüklü değilse ve uygulama yüklenemiyorsa, bağlantı kullanıcıyı bu URL'ye yönlendirecektir. -
androidPackageName
veIOSBundleId
: Bir Android veya Apple cihazında oturum açma bağlantısı açıldığında kullanılacak uygulamalar. Mobil uygulamalar yoluyla e-posta işlem bağlantılarını açmak için Firebase Dynamic Links'in nasıl yapılandırılacağı hakkında daha fazla bilgi edinin. -
handleCodeInApp
: true olarak ayarlayın. Diğer bant dışı e-posta işlemlerinden (şifre sıfırlama ve e-posta doğrulamaları) farklı olarak, oturum açma işleminin her zaman uygulamada tamamlanması gerekir. Bunun nedeni, akışın sonunda kullanıcının oturum açmasının beklenmesi ve kimlik doğrulama durumunun uygulama içinde kalmasıdır. -
dynamicLinkDomain
: Bir proje için birden fazla özel dinamik bağlantı alanı tanımlandığında, bağlantı belirli bir mobil uygulama aracılığıyla açılacağı zaman hangisinin kullanılacağını belirtin (örneğin,example.page.link
). Aksi takdirde, ilk etki 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 Eylemlerinde Geçiş Durumu bölümüne bakın.
-
Kullanıcıdan e-postasını isteyin.
Kimlik doğrulama bağlantısını kullanıcının e-postasına gönderin ve kullanıcının e-posta oturumunu aynı cihazda tamamlaması durumunda 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üvenlik endişeleri
İstenmeyen bir kullanıcı olarak veya istenmeyen bir cihazda oturum açmak için oturum açma bağlantısının kullanılmasını önlemek için Firebase Auth, oturum açma akışını tamamlarken kullanıcının e-posta adresinin sağlanmasını gerektirir. Oturum açmanın başarılı olması için bu e-posta adresinin, oturum açma bağlantısının orijinal olarak gönderildiği adresle eşleşmesi gerekir.
Oturum açma e-postasını gönderdiğinizde, örneğin SharedPreferences'ı kullanarak e-posta adreslerini yerel olarak depolayarak, bağlantıyı istedikleri cihazda oturum açma bağlantısını açan kullanıcılar için bu akışı kolaylaştırabilirsiniz. Ardından, akışı tamamlamak için bu adresi kullanın. Kullanıcının e-postasını yeniden yönlendirme URL'si parametrelerinde iletmeyin ve oturum enjeksiyonlarını etkinleştirebileceği için yeniden kullanmayın.
Oturum açma işlemi tamamlandıktan sonra, daha önce doğrulanmamış tüm oturum açma mekanizmaları kullanıcıdan kaldırılacak ve mevcut tüm oturumlar geçersiz kılınacaktır. Örneğin, birisi daha önce aynı e-posta ve parolayla doğrulanmamış bir hesap oluşturduysa, sahiplik iddiasında bulunan ve bu doğrulanmamış hesabı oluşturan taklitçinin doğrulanmamış e-posta ve parolayla tekrar oturum açmasını önlemek için kullanıcının parolası kaldırılacaktır.
Bağlantınızın potansiyel olarak aracı sunucular tarafından ele geçirilmesini önlemek için üretimde bir HTTPS URL'si kullandığınızdan emin olun.
Bir Android Uygulamasında oturum açmayı tamamlama
Firebase Authentication, e-posta bağlantısını bir mobil cihaza göndermek için Firebase Dynamic Links'i kullanır. Mobil uygulama aracılığıyla oturum açma işleminin tamamlanması için, uygulamanın gelen uygulama bağlantısını algılaması, temeldeki derin bağlantıyı ayrıştırması ve ardından oturum açmayı tamamlaması için yapılandırılması gerekir.
Firebase Dinamik Bağlantılarını Yapılandırma
Firebase Auth, bir mobil uygulamada açılması amaçlanan bir bağlantı gönderirken Firebase Dynamic Links'i kullanır. Bu özelliği kullanmak için Firebase Konsolunda Dinamik Bağlantılar yapılandırılmalıdır .
Firebase Dynamic Links'i etkinleştirin:
- Firebase konsolunda Dinamik Bağlantılar bölümünü açın.
Dinamik Bağlantılar şartlarını henüz kabul etmediyseniz ve bir Dinamik Bağlantılar alanı oluşturmadıysanız, bunu şimdi yapın.
Zaten bir Dinamik Bağlantılar alanı oluşturduysanız, not alın. Dinamik Bağlantılar alanı genellikle aşağıdaki örneğe benzer:
example.page.link
Gelen bağlantıyı kesmek için Apple veya Android uygulamanızı yapılandırdığınızda bu değere ihtiyacınız olacak.
Android uygulamalarını yapılandırma:
- Android uygulamanızdan bu linkleri işleyebilmeniz için Firebase Konsolu proje ayarlarında Android paket adının belirtilmesi gerekir. Ayrıca, başvuru sertifikasının SHA-1 ve SHA-256'sının sağlanması gerekmektedir.
- Artık bir dinamik bağlantı etki alanı 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önlendirilecektir.
- Dinamik bağlantının belirli bir etkinliğe yönlendirme yapmasını istiyorsanız, AndroidManifest.xml dosyanızda bir amaç filtresi yapılandırmanız gerekir. Bu, amaç filtresinde dinamik bağlantı etki alanınızı veya e-posta eylem işleyicisini belirterek yapılabilir. Varsayılan olarak, e-posta eylem işleyicisi aşağıdaki örnek gibi bir etki alanında barındırılır:
PROJECT_ID.firebaseapp.com/
- Uyarılar:
- actionCodeSettings üzerinde ayarladığınız URL'yi niyet filtrenizde belirtmeyin.
- Dinamik bağlantı etki alanınızı oluştururken, kısa bir URL bağlantısı da oluşturmuş olabilirsiniz. Bu kısa URL aktarılmayacak; niyet filtrenizi onu bir
android:pathPrefix
özniteliğ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ğinizi 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 Dinamik Bağlantıları Alma talimatlarına bakın.
Bağlantıyı doğrulayın ve oturum açın
Bağlantıyı yukarıda açıklandığı şekilde aldıktan sonra, bunun e-posta bağlantısı kimlik doğrulaması için tasarlandığını 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()); } } }); }
Bir Apple uygulamasında e-posta bağlantısıyla oturum açmanın 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çmayı nasıl yapacağınızı öğrenmek için Web kılavuzuna bakın.
E-posta bağlantısı ile bağlama/yeniden kimlik doğrulama
Bu kimlik doğrulama yöntemini mevcut bir kullanıcıya da bağlayabilirsiniz. Örneğin, telefon numarası gibi daha önce başka bir sağlayıcıyla kimliği doğrulanmış bir kullanıcı, bu oturum açma yöntemini mevcut hesabına ekleyebilir.
Fark, operasyonun 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şlemi çalıştırmadan önce bir 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ış, orijinal kullanıcının oturum açmadığı farklı bir cihazda sona erebileceğinden bu akış tamamlanmayabilir. Bu durumda, kullanıcıya bağlantıyı aynı cihazda açmaya zorlamak için bir hata gösterilebilir. İşlem türü ve kullanıcı kullanıcı kimliği hakkında bilgi sağlamak için bağlantıda bazı durumlar iletilebilir.
E-posta/şifreyi e-posta bağlantısından ayırt etme
E-posta ile hem parola hem de bağlantı tabanlı oturum açmayı destekliyorsanız, bir parola/bağlantı kullanıcısı için oturum açma yöntemini farklılaştırmak için fetchSignInMethodsForEmail
kullanın. Bu, kullanıcıdan önce e-posta adresini sağlamasının istendiği ve ardından oturum açma yönteminin sunulduğu tanımlayıcı öncelikli akışlar için kullanışlıdır:
Kotlin+KTX
Firebase.auth.fetchSignInMethodsForEmail(email) .addOnSuccessListener { result -> val signInMethods = result.signInMethods!! if (signInMethods.contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD)) { // User can sign in with email/password } else if (signInMethods.contains(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD)) { // User can sign in with email/link } } .addOnFailureListener { exception -> Log.e(TAG, "Error getting sign in methods for user", exception) }
Java
auth.fetchSignInMethodsForEmail(email) .addOnCompleteListener(new OnCompleteListener<SignInMethodQueryResult>() { @Override public void onComplete(@NonNull Task<SignInMethodQueryResult> task) { if (task.isSuccessful()) { SignInMethodQueryResult result = task.getResult(); List<String> signInMethods = result.getSignInMethods(); if (signInMethods.contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD)) { // User can sign in with email/password } else if (signInMethods.contains(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD)) { // User can sign in with email/link } } else { Log.e(TAG, "Error getting sign in methods for user", task.getException()); } } });
Yukarıda açıklandığı gibi, e-posta/şifre ve e-posta/bağlantı, farklı oturum açma yöntemleriyle aynı EmailAuthProvider
(aynı PROVIDER_ID
) olarak kabul edilir.
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 (yani, kullanıcı adı ve parolası, telefon numarası veya kimlik doğrulama sağlayıcı bilgileri) bağlanır. Bu yeni hesap, Firebase projenizin bir parçası olarak saklanır ve kullanıcının nasıl oturum açtığına bakılmaksızın projenizdeki her uygulamada bir kullanıcıyı tanımlamak için kullanılabilir.
Uygulamalarınızda, kullanıcının temel profil bilgilerini
FirebaseUser
nesnesinden alabilirsiniz. Bkz . Kullanıcıları Yönetin .Firebase Gerçek Zamanlı Veritabanı ve Bulut Depolama Güvenlik Kurallarınızda , oturum açmış kullanıcının benzersiz kullanıcı kimliğini
auth
değişkeninden alabilir ve bunu, bir kullanıcının hangi verilere erişebileceğini kontrol etmek için kullanabilirsiniz.
Bir kullanıcının oturumunu kapatmak için signOut
öğesini arayın:
Kotlin+KTX
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();