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 Kimlik Doğrulama'yı 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ünme kaydı ve oturum açma.
- Uygulamalar arasında daha düşük parola yeniden kullanım riski, bu da iyi seçilmiş parolaların bile güvenliğini tehlikeye atabilir.
- Bir kullanıcının kimliğini doğrulama ve aynı zamanda kullanıcının bir e-posta adresinin yasal sahibi olduğunu 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ı veya sosyal medya hesabı sahibi olmanız gerekmez.
- Bir kullanıcı, bir mobil cihazda hantal olabilen bir şifre sağlamaya (veya hatırlamaya) gerek kalmadan güvenli bir şekilde oturum açabilir.
- Daha önce bir e-posta tanımlayıcısı (parola veya birleşik) ile oturum açmış mevcut bir kullanıcı, yalnızca e-posta ile oturum açmak üzere yükseltilebilir. Örneğin, parolasını unutan bir kullanıcı, parolasını sıfırlamaya gerek kalmadan yine de oturum açabilir.
Sen başlamadan önce
Android projenizi kurun
Henüz yapmadıysanız, Android projenize Firebase'i ekleyin .
Firebase Android BoM kullanarak, modülünüzdeki (app-level) Gradle dosyanızdaki (genellikle
app/build.gradle
) Firebase Authentication Android kitaplığının bağımlılığını bildirin.Ayrıca, Firebase Authentication'ı ayarlamanın bir parçası olarak, uygulamanıza Google Play hizmetleri SDK'sını eklemeniz gerekir.
Java
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:30.0.1') // Declare 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 declare the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.2.0' }Firebase Android BoM'u kullanarak uygulamanız her zaman Firebase Android kitaplıklarının uyumlu sürümlerini kullanır.
(Alternatif) BoM kullanmadan Firebase kitaplık bağımlılıklarını bildirin
Firebase Malzeme Listesini kullanmamayı seçerseniz, her bir Firebase kitaplık 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'yi kullanmanızı şiddetle tavsiye ettiğimizi unutmayın; bu, tüm sürümlerin uyumlu olmasını sağlar.
dependencies { // Declare 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:21.0.4'
// Also declare the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.2.0' }Kotlin+KTX
dependencies { // Import the BoM for the Firebase platform implementation platform('com.google.firebase:firebase-bom:30.0.1') // Declare 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 declare the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.2.0' }Firebase Android BoM'u kullanarak uygulamanız her zaman Firebase Android kitaplıklarının uyumlu sürümlerini kullanır.
(Alternatif) BoM kullanmadan Firebase kitaplık bağımlılıklarını bildirin
Firebase Malzeme Listesini kullanmamayı seçerseniz, her bir Firebase kitaplık 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'yi kullanmanızı şiddetle tavsiye ettiğimizi unutmayın; bu, tüm sürümlerin uyumlu olmasını sağlar.
dependencies { // Declare 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:21.0.4'
// Also declare the dependency for the Google Play services library and specify its version implementation 'com.google.android.gms:play-services-auth:20.2.0' }
Firebase projeniz için E-posta Bağlantısı oturum açmayı etkinleştirin
Kullanıcıları e-posta bağlantısıyla oturum açmak için, önce Firebase projeniz için E-posta sağlayıcısını ve E-posta bağlantısı oturum açma yöntemini etkinleştirmelisiniz:
- Firebase konsolunda , Yetkilendirme 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/şifre oturum açmanın etkinleştirilmesi gerektiğini unutmayın.
- Aynı bölümde, E-posta bağlantısı (parolasız 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-postasına 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
: Gömülecek 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) giderek bulunabilen yetkili etki alanlarının Firebase Konsolu listesinde beyaz listeye eklenmelidir. Uygulama, cihazında yüklü değilse ve uygulama yüklenemezse, bağlantı kullanıcıyı bu URL'ye yönlendirir. -
androidPackageName
veIOSBundleId
: Bir Android veya Apple cihazında oturum açma bağlantısı açıldığında kullanılacak uygulamalar. Mobil uygulamalar aracılığıyla e-posta eylemi bağlantılarını açmak için Firebase Dinamik Bağlantılarını nasıl yapılandıracağınız 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 Auth durumunun uygulamada devam etmesidir. -
dynamicLinkDomain
: Bir proje için birden çok özel dinamik bağlantı etki alanı tanımlandığında, bağlantı belirli bir mobil uygulama aracılığıyla açıldığında hangisinin kullanılacağını belirtin (örneğin,example.page.link
). Aksi takdirde, ilk alan otomatik olarak seçilir.
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();
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 */) }
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.
Kullanıcının e-posta adresine kimlik doğrulama bağlantısını gönderin ve kullanıcının aynı cihazda e-posta oturum açma işlemini tamamlaması durumunda kullanıcının e-postasını kaydedin.
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."); } } });
Kotlin+KTX
Firebase.auth.sendSignInLinkToEmail(email, actionCodeSettings) .addOnCompleteListener { 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
Firebase Auth, istenmeyen bir kullanıcı olarak veya istenmeyen bir cihazda oturum açmak için bir oturum açma bağlantısının kullanılmasını önlemek için, oturum açma akışı tamamlanırken kullanıcının e-posta adresinin sağlanmasını gerektirir. Oturum açma işleminin 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.
Bağlantıyı istedikleri cihazda oturum açma bağlantısını açan kullanıcılar için, oturum açma e-postasını gönderdiğinizde e-posta adreslerini yerel olarak (örneğin SharedPreferences kullanarak) depolayarak bu akışı kolaylaştırabilirsiniz. Ardından, akışı tamamlamak için bu adresi kullanın. Kullanıcının e-postasını yönlendirme URL parametrelerinde iletmeyin ve oturum enjeksiyonlarını etkinleştirebileceğinden yeniden kullanın.
Oturum açma tamamlandıktan sonra, önceki doğrulanmamış oturum açma mekanizmaları kullanıcıdan kaldırılacak ve mevcut oturumlar geçersiz kılınacaktır. Örneğin, birisi daha önce aynı e-posta ve şifre ile doğrulanmamış bir hesap oluşturduysa, sahipliği iddia eden ve bu doğrulanmamış hesabı oluşturan taklitçinin doğrulanmamış e-posta ve şifre ile tekrar oturum açmasını önlemek için kullanıcının şifresi kaldırılacaktır.
Ayrıca, bağlantınızın aracı sunucular tarafından potansiyel olarak 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ılayacak, temel alınan derin bağlantıyı ayrıştıracak ve ardından oturum açma işlemini tamamlayacak şekilde 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 Dinamik Bağlantılarını 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 etki alanı oluşturduysanız, bunu şimdi yapın.
Zaten bir Dinamik Bağlantılar alanı oluşturduysanız, bunu not alın. Bir Dynamic Links etki alanı genellikle aşağıdaki örneğe benzer:
example.page.link
Apple veya Android uygulamanızı gelen bağlantıyı kesecek şekilde yapılandırırken bu değere ihtiyacınız olacak.
Android uygulamalarını yapılandırma:
- Bu bağlantıları Android uygulamanızdan işlemek için Firebase Console 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ı 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önlendirilmesini istiyorsanız, AndroidManifest.xml dosyanızda bir amaç filtresi yapılandırmanız gerekir. Bu, dinamik bağlantı etki alanınızı veya niyet filtresinde e-posta eylemi 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:
- Niyet filtrenizde actionCodeSettings üzerinde ayarladığınız URL'yi belirtmeyin.
- Dinamik bağlantı alanınızı oluştururken kısa bir URL bağlantısı da oluşturmuş olabilirsiniz. Bu kısa URL iletilmez; niyet filtrenizi bir
android:pathPrefix
özniteliği ile yakalamak için 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ıları alma hakkında daha fazla bilgi için Android Dinamik Bağlantılarını Alma talimatlarına bakın.
Bağlantıyı doğrulayın ve oturum açın
Bağlantıyı yukarıda açıklandığı gibi aldıktan sonra, bunun e-posta bağlantısı doğrulaması için olduğunu doğrulayın ve oturum açmayı tamamlayın.
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()); } } }); }
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) } } }
Bir Apple uygulamasında e-posta bağlantısıyla oturum açma 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çmanın nasıl ele alınacağını öğrenmek için Web kılavuzuna bakın.
E-posta bağlantısıyla bağlama/yeniden kimlik doğrulama
Bu kimlik doğrulama yöntemini mevcut bir kullanıcıya da bağlayabilirsiniz. Örneğin, daha önce telefon numarası gibi 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:
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+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) } }
Bu, hassas bir işlemi çalıştırmadan önce bir e-posta bağlantısı kullanıcısını yeniden doğrulamak için de kullanılabilir.
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()); } } });
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) } }
Ancak akış, orijinal kullanıcının oturum açmadığı farklı bir cihazda sonlanabileceğinden, bu akış tamamlanmayabilir. Bu durumda, kullanıcıyı bağlantıyı aynı cihazda açmaya zorlamak için bir hata gösterilebilir. İşlem türü ve kullanıcı kimliği hakkında bilgi sağlamak için bağlantıda bazı durumlar geçirilebilir.
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 ayırt etmek için fetchSignInMethodsForEmail
kullanın. Bu, kullanıcıdan önce e-postasını 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:
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()); } } });
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) }
Yukarıda açıklandığı gibi, e-posta/parola 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 oturum açtığı kullanıcı adı ve parolası, telefon numarası veya yetkilendirme sağlayıcı bilgileri gibi kimlik bilgileriyle ilişkilendirilir. 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 bir 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 konusuna bakın.Firebase Gerçek Zamanlı Veritabanınız 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
arayın:
Java
FirebaseAuth.getInstance().signOut();
Kotlin+KTX
Firebase.auth.signOut()