Google is committed to advancing racial equity for Black communities. See how.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

İOS'ta E-posta Bağlantısı Kullanarak Firebase ile Kimlik Doğrulama

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ğrulaması'nı kullanabilirsiniz. İşlem sırasında, 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.
  • İyi seçilmiş şifrelerin güvenliğini zayıflatabilecek uygulamalar arasında daha düşük parola yeniden kullanma riski.
  • Kullanıcının bir e-posta adresinin yasal sahibi olduğunu doğrularken 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. Telefon numarası veya sosyal medya hesabına sahip olmak gerekmez.
  • Bir kullanıcı, bir mobil cihazda hantal olabilecek bir şifre sağlamaya (veya hatırlamaya) gerek kalmadan güvenli bir şekilde oturum açabilir.
  • Daha önce bir e-posta tanımlayıcıyla (şifre veya federasyon) oturum açan mevcut bir kullanıcı yalnızca e-posta ile oturum açacak şekilde yükseltilebilir. Örneğin, parolasını unutmuş bir kullanıcı, parolalarını sıfırlamaya gerek kalmadan oturum açabilir.

Sen başlamadan önce

  1. İOS projenize Firebase ekleyin . Senin şu bakla ekleyin Podfile :
    pod 'Firebase/Auth'
    
  2. Uygulamanızı henüz Firebase projenize bağlamadıysanız , Firebase konsolundan yapın .

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ştirmeniz gerekir:

  1. In Firebase konsoluna , Auth bölümünü açın.
  2. Oturum açma yöntemi sekmesinde E-posta / Parola sağlayıcısını etkinleştirin. E-posta bağlantısında oturum açmayı kullanabilmek için e-posta / şifre ile oturum açmanın etkinleştirilmesi gerektiğini unutmayın.
  3. Aynı bölümde, E-posta bağlantısı (şifresiz oturum açma) oturum açma yöntemini etkinleştirin.
  4. Kaydet'i tıklayın .

Kimlik doğrulama akışını başlatmak için, kullanıcıya kullanıcıdan e-posta adreslerini vermesini isteyen bir arabirim sendSignInLinkToEmail:actionCodeSettings:completion: ve ardından sendSignInLinkToEmail:actionCodeSettings:completion: kullanıcının e-postasına kimlik doğrulama bağlantısını göndermesini istemek için sendSignInLinkToEmail:actionCodeSettings:completion: arayın.

  1. ActionCodeSettings 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 ek durumlar. Bağlantının etki alanının, Oturum Açma yöntemi sekmesine (Kimlik Doğrulama -> Oturum açma yöntemi) giderek bulunabilecek Firebase Konsolu yetkili etki alanları listesinde beyaz listeye eklenmesi gerekir.
    • iOSBundleID ve androidPackageName: Oturum açma bağlantısı bir Android veya iOS cihazında açıldığında kullanılacak uygulamalar. Firebase Dinamik Bağlantılarını mobil uygulamalar üzerinden e-posta işlem bağlantılarını açacak şekilde yapılandırma hakkında daha fazla bilgi edinin.
    • handleCodeInApp: true olarak ayarlayın. Oturum açma işlemi, diğer bant dışı e-posta işlemlerinden (şifre sıfırlama ve e-posta doğrulama) farklı olarak uygulamada her zaman tamamlanmalıdır. Bunun nedeni, akışın sonunda kullanıcının oturum açması beklenir ve uygulama içinde Yetkilendirme durumunun devam etmesi.
    • dynamicLinkDomain: Bir proje için birden fazla özel dinamik bağlantı etki alanı tanımlandığında, bağlantı belirtilen bir mobil uygulama aracılığıyla açılacakken hangisinin kullanılacağını belirtin (örneğin, example.page.link ). Aksi takdirde ilk etki alanı otomatik olarak seçilir.

    hızlı

    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"];
    

    ActionCodeSettings hakkında daha fazla bilgi edinmek için, E-posta İşlemleri'ndeki Geçiş Durumu bölümüne bakın.

  2. Kullanıcıdan e-postalarını isteyin.

  3. 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.

    hızlı

    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"];
        // ...
    }];
    

Güvenlik endişeleri

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 için Firebase Auth, oturum açma akışını tamamlarken kullanıcının e-posta adresinin girilmesini 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 e-posta adreslerini yerel olarak depolayarak, oturum açma bağlantısını bağlantı istedikleri cihazda açan kullanıcılar için bu akışı düzenleyebilirsiniz. Ardından, akışı tamamlamak için bu adresi kullanın.

Oturum açma tamamlandıktan sonra, daha önce doğrulanmamış oturum açma mekanizması kullanıcıdan kaldırılır ve mevcut oturumlar geçersiz kılınır. Örneğin, bir kullanıcı daha önce aynı e-posta ve şifreyle doğrulanmamış bir hesap oluşturduysa, sahiplik talebinde bulunan ve doğrulanmamış hesabın aynı hesapla tekrar oturum açmasını önlemek için kullanıcının şifresi kaldırılır.

Bir iOS mobil uygulamasında oturum açmayı tamamlama

Firebase Kimlik Doğrulaması, e-posta bağlantısını bir mobil cihaza göndermek için Firebase Dinamik Bağlantıları'nı kullanır. Mobil uygulama aracılığıyla oturum açma işlemini tamamlamak için, uygulamanın gelen uygulama bağlantısını algılayacak, alttaki derin bağlantıyı ayrıştıracak ve ardından oturum açmayı tamamlayacak şekilde yapılandırılması gerekir.

Firebase Auth, bir mobil uygulamada açılması amaçlanan bir bağlantı gönderirken Firebase Dinamik Bağlantılarını kullanır. Bu özelliği kullanmak için Firebase Konsolunda Dinamik Bağlantıların yapılandırılması gerekir.

  1. Firebase Dinamik Bağlantılarını Etkinleştir:

    1. Firebase konsolunda Dinamik Bağlantılar bölümünü açın.
    2. Dinamik Bağlantılar koşullarını henüz kabul etmediyseniz ve bir Dinamik Bağlantılar etki alanı oluşturmadıysanız, şimdi yapın.

      Önceden bir Dinamik Bağlantılar etki alanı oluşturduysanız, buna dikkat edin. Dinamik Bağlantılar etki alanı genellikle aşağıdaki örneğe benzer:

      example.page.link

      İOS veya Android uygulamanızı gelen bağlantıyı kesecek şekilde yapılandırdığınızda bu değere ihtiyacınız olacaktır.

  2. İOS uygulamalarını yapılandırma:

    1. Bu bağlantıları iOS uygulamanızdan yönetmeyi planlıyorsanız, iOS paket kimliğinin Firebase Konsolu proje ayarlarında belirtilmesi gerekir. Ayrıca, App Store Kimliği ve Apple Developer Team ID'nin de belirtilmesi gerekir.
    2. Ayrıca, uygulama yeteneklerinizde e-posta işlemi işleyicisi alanınızı İlişkili Alan Adı olarak yapılandırmanız gerekir. Varsayılan olarak, e-posta işlemi işleyicisi aşağıdaki örnek gibi bir etki alanında barındırılır:
       APP_ID .firebaseapp.com
    3. Uygulamanızı iOS 8 ve sonraki sürümlere dağıtmayı planlıyorsanız, iOS paket kimliğinizi gelen URL'ler için özel bir şema olarak ayarlamanız gerekir.
    4. Bununla ilgili daha fazla bilgi için iOS Dinamik Bağlantıları Alma talimatlarına bakın .

Bağlantıyı yukarıda açıklandığı gibi aldıktan sonra, bunun e-posta bağlantısı kimlik doğrulaması için yapıldığını doğrulayın ve oturum açmayı tamamlayın.

hızlı

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) {
      // ...
    }];
}

Bir Android uygulamasında oturum açmayı e-posta bağlantısıyla nasıl ele alacağınızı öğrenmek için Android kılavuzuna bakın.

Bir web uygulamasında oturum açma e-postası bağlantısıyla nasıl başa çıkılacağını öğrenmek için Web kılavuzuna bakın.

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 hesaplarına ekleyebilir.

Fark, operasyonun ikinci yarısında olurdu:

hızlı

  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.
  }];

Bu, hassas bir işlemi çalıştırmadan önce bir e-posta bağlantısı kullanıcısının yeniden kimliğini doğrulamak için de kullanılabilir.

hızlı

  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.
  }];

Ancak akış, orijinal kullanıcının oturum açmadığı farklı bir cihazda sonuçlanabileceğinden, bu akış tamamlanmayabilir. Bu durumda, kullanıcıya aynı cihazdaki bağlantıyı 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ıya bazı durumlar iletilebilir.

Hem parola hem de bağlantı tabanlı oturum açmayı e-posta ile desteklemeniz durumunda, 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-postalarını vermesinin istendiği ve daha sonra oturum açma yönteminin sunulduğu ilk tanımlayıcı akışları için kullanışlıdır:

hızlı

 // After asking the user for their email.
 Auth.auth().fetchSignInMethods(forEmail: email) { signInMethods, error in
   // This returns the same array as fetchProviders(forEmail:completion:) but for email
   // provider identified by 'password' string, signInMethods would contain 2
   // different strings:
   // 'emailLink' if the user previously signed in with an email/link
   // 'password' if the user has a password.
   // A user could have both.
   if (error) {
     // Handle error case.
   }
   if (!signInMethods.contains(EmailPasswordAuthSignInMethod)) {
     // User can sign in with email/password.
   }
   if (!signInMethods.contains(EmailLinkAuthSignInMethod)) {
     // User can sign in with email/link.
   }
 }

Objective-C

 // After asking the user for their email.
 [FIRAuth auth] fetchSignInMethodsForEmail:email
                                completion:^(NSArray *_Nullable signInMethods,
                                             NSError *_Nullable error) {
   // This returns the same array as fetchProvidersForEmail but for email
   // provider identified by 'password' string, signInMethods would contain 2
   // different strings:
   // 'emailLink' if the user previously signed in with an email/link
   // 'password' if the user has a password.
   // A user could have both.
   if (error) {
     // Handle error case.
   }
   if (![signInMethods containsObject:FIREmailPasswordAuthSignInMethod]) {
     // User can sign in with email/password.
   }
   if (![signInMethods containsObject:FIREmailLinkAuthSignInMethod]) {
     // User can sign in with email/link.
   }
 }];

Yukarıda açıklandığı gibi, e-posta / şifre ve e-posta / bağlantı, farklı oturum açma yöntemleriyle aynı FIREmailAuthProvider (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 kimlik bilgileriyle (yani kullanıcı adı ve parolası, telefon numarası veya kimlik doğrulama sağlayıcısı bilgileri) oturum açan kullanıcıyla bağlantılandırılır. Bu yeni hesap Firebase projenizin bir parçası olarak saklanı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 FIRUser nesnesinden alabilirsiniz. Bkz. Kullanıcıları Yönetme .

  • Firebase Gerçek Zamanlı Veritabanınızda ve Bulut Depolama Güvenliği Kurallarınızda , oturum auth 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ısı kimlik bilgilerini mevcut bir kullanıcı hesabına bağlayarak kullanıcıların uygulamanızda birden fazla kimlik doğrulama sağlayıcısı kullanarak oturum açmasına izin verebilirsiniz .

Bir kullanıcının oturumunu kapatmak için signOut: arayın.

hızlı

    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;
}

Tüm kimlik doğrulama hataları için hata işleme kodu da eklemek isteyebilirsiniz. Bkz. Hataları Ele Alma .