Apple Platformlarında E-posta Bağlantısını Kullanarak Firebase ile Kimlik Doğrulama

Bir kullanıcıya, oturum açmak için tıklayabileceği 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-postayla oturum açmanın birçok avantajı vardır:

  • Düşük sürtünmeli kayıt ve oturum açma.
  • İyi seçilmiş şifrelerin güvenliğini bile zayıflatabilecek uygulamalar arasında şifrelerin yeniden kullanılması riski daha düşüktür.
  • Bir kullanıcının kimliğini doğrulamanın yanı sıra kullanıcının bir e-posta adresinin yasal sahibi olduğunu da doğrulama yeteneği.
  • Kullanıcının oturum açmak için yalnızca erişilebilir bir e-posta hesabına ihtiyacı vardır. Telefon numarasına veya sosyal medya hesabına sahip olmanız gerekmez.
  • Kullanıcı, mobil cihazda zahmetli 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 birleşik) oturum açan mevcut bir kullanıcı, yalnızca e-postayla oturum açacak şekilde yükseltilebilir. Örneğin, şifresini unutan bir kullanıcı, şifresini sıfırlamaya gerek kalmadan yine de oturum açabilir.

Sen başlamadan önce

Firebase bağımlılıklarını yüklemek ve yönetmek için Swift Paket Yöneticisini kullanın.

  1. Xcode'da uygulama projeniz açıkken Dosya > Paket Ekle'ye gidin.
  2. İstendiğinde Firebase Apple platformları SDK deposunu ekleyin:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Firebase Kimlik Doğrulama kitaplığını seçin.
  5. -ObjC bayrağını hedefinizin derleme ayarlarının Diğer Bağlayıcı Bayrakları bölümüne ekleyin.
  6. Bitirdiğinizde Xcode, bağımlılıklarınızı arka planda otomatik olarak çözmeye ve indirmeye başlayacaktır.

Kullanıcıların e-posta bağlantısıyla oturum açmasını sağlamak için öncelikle 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. Firebase konsolunda Kimlik Doğrulama 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ıyla oturum açmayı kullanmak için e-posta/şifreyle 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 adresini girmesini 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 sendSignInLink çağırın.

  1. 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 ek durumlar. Bağlantının alan adının Firebase Konsolu yetkili alan adları listesinde beyaz listeye alınması gerekir; bu listeye Oturum açma yöntemi sekmesine (Kimlik Doğrulama -> Oturum açma yöntemi) giderek ulaşılabilir.
    • iOSBundleID ve androidPackageName : Bir Android veya Apple cihazında oturum açma bağlantısı açıldığında kullanılacak uygulamalar. Firebase Dinamik Bağlantılarını mobil uygulamalar aracılığıyla e-posta işlem bağlantılarını açacak şekilde nasıl yapılandıracağınız hakkında daha fazla bilgi edinin.
    • handCodeInApp: 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 uygulamada Kimlik Doğrulama durumunun devam etmesidir.
    • 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 halde ilk alan adı otomatik olarak seçilir.

    Süratli

    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")
    

    Amaç-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 Eylemlerinde Geçiş Durumu bölümüne bakın.

  2. Kullanıcıdan e-postası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-postayla oturum açma işlemini aynı cihazda tamamlaması ihtimaline karşı kullanıcının e-postasını kaydedin.

    Süratli

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

    Amaç-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 amacıyla 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 ilk 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ı talep ettikleri cihazda açan kullanıcılar için bu akışı kolaylaştırabilirsiniz. Daha sonra akışı tamamlamak için bu adresi kullanın.

Oturum açma işleminin tamamlanmasının ardından, 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 şifreyle doğrulanmamış bir hesap oluşturduysa, bu doğrulanmamış hesabın sahibi olduğunu iddia eden ve bu doğrulanmamış hesabı oluşturan kişinin aynı hesapla tekrar oturum açmasını önlemek için kullanıcının şifresi kaldırılacaktır.

Apple mobil uygulamasında oturum açma işlemini tamamlama

Firebase Authentication, 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şleminin tamamlanması için uygulamanın, gelen uygulama bağlantısını algılayacak, temeldeki derin bağlantıyı ayrıştıracak ve ardından oturum açma işlemini tamamlayacak şekilde yapılandırılması gerekir.

Firebase Auth, bir mobil uygulamada açılması amaçlanan bir bağlantıyı gönderirken Firebase Dinamik Bağlantılarını kullanır. Bu özelliği kullanabilmek 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. Henüz Dinamik Bağlantılar şartlarını 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 bunu not edin. Dinamik Bağlantılar 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 olacaktır.

  2. Apple uygulamalarını yapılandırma:

    1. Bu bağlantıları uygulamanızdan yönetmeyi planlıyorsanız paket kimliğinin Firebase Konsolu proje ayarlarında belirtilmesi gerekir. Ayrıca App Store ID ve Apple Developer Team ID'nin de belirtilmesi gerekiyor.
    2. Ayrıca uygulama yeteneklerinizde e-posta eylem işleyicisi etki alanınızı İlişkili Etki Alanı olarak yapılandırmanız gerekecektir. Varsayılan olarak, e-posta eylem işleyicisi aşağıdaki örnekteki gibi bir etki alanında barındırılır:
      APP_ID.firebaseapp.com
    3. Uygulamanızı iOS 8 ve daha eski sürümlere dağıtmayı planlıyorsanız paket kimliğinizi, gelen URL'ler için özel bir şema olarak ayarlamanız gerekecektir.
    4. Bu konuda daha fazla bilgi için Apple platformu Dinamik Bağlantılarını 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ı amaçlı olduğunu doğrulayın ve oturum açma işlemini tamamlayın.

Süratli

if Auth.auth().isSignIn(withEmailLink: link) {
        Auth.auth().signIn(withEmail: email, link: self.link) { user, error in
          // ...
        }
}

Amaç-C

if ([[FIRAuth auth] isSignInWithEmailLink:link]) {
    [[FIRAuth auth] signInWithEmail:email
                               link:link
                         completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      // ...
    }];
}

Bir Android uygulamasında e-posta bağlantısıyla oturum açmanın nasıl işleneceğini öğrenmek için Android kılavuzuna bakın.

Bir web uygulamasında e-posta bağlantısıyla oturum açmanın nasıl yapı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ğrulanan bir kullanıcı, bu oturum açma yöntemini mevcut hesabına ekleyebilir.

Fark operasyonun ikinci yarısında olacaktır:

Süratli

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

Amaç-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 aynı zamanda 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.

Süratli

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

Amaç-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, bağlantıyı aynı cihazda açmaya zorlamak için bir hata gösterilebilmektedir. İşlemin türü ve kullanıcı kimliği hakkında bilgi sağlamak için bağlantıya bazı durumlar aktarılabilir.

Projenizi 15 Eylül 2023 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 daha önce tanımlayıcı öncelikli akışları uygulamak için önerdiğimiz fetchSignInMethodsForEmail() yöntemini devre dışı bırakır.

Projeniz için e-posta numaralandırma korumasını devre dışı bırakabilseniz de bunu yapmamanızı öneririz.

Daha fazla ayrıntı için e-posta numaralandırma korumasına ilişkin belgelere 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 bilgileriyle (yani kullanıcı adı ve parolası, telefon numarası veya kimlik doğrulama sağlayıcı bilgileri) ilişkilendirilir. Bu yeni hesap, Firebase projenizin bir parçası olarak depolanı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 User nesnesinden alabilirsiniz. Bkz . Kullanıcıları Yönetme .

  • Firebase Gerçek Zamanlı Veritabanı ve Bulut Depolama Güvenliği Kurallarınızda , oturum açan kullanıcının benzersiz kullanıcı kimliğini auth değişkeninden alabilir ve bunu, 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 birden fazla kimlik doğrulama sağlayıcısı kullanarak uygulamanızda oturum açmasına izin verebilirsiniz.

Bir kullanıcının oturumunu kapatmak için signOut: öğesini çağırın.

Süratli

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

Amaç-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

Kimlik doğrulama hatalarının tamamı için hata işleme kodunu da eklemek isteyebilirsiniz. Bkz. Hataları İşleme .