iOS uygulamanıza TOTP çok öğeli kimlik doğrulaması ekleyin

Firebase Authentication with Identity Platform sürümüne yükseldiyseniz uygulamanıza zamana dayalı tek kullanımlık şifre (TOTP) çok faktörlü kimlik doğrulaması (MFA) ekleyebilirsiniz.

Firebase Authentication with Identity Platform, MFA için ek faktör olarak TOTP kullanmanıza olanak tanır. Bu özelliği etkinleştirdiğinizde, uygulamanızda oturum açmaya çalışan kullanıcılar TOTP isteği görür. Bu kodu oluşturmak için Google Authenticator gibi geçerli TOTP kodları oluşturabilen bir kimlik doğrulama uygulaması kullanmalıdır.

Başlamadan önce

  1. MFA'yı destekleyen en az bir sağlayıcıyı etkinleştirin. Aşağıdakiler hariç tüm sağlayıcıların MFA'yı desteklediğini unutmayın:

    • Telefonla kimlik doğrulama
    • Anonim kimlik doğrulama
    • Özel yetkilendirme jetonları
    • Apple Game Center
  2. Uygulamanızın kullanıcı e-posta adreslerini doğruladığından emin olun. Çok faktörlü kimlik doğrulama için e-posta doğrulaması gerekir. Bu sayede kötü niyetli kişiler, kendilerine ait olmayan bir e-posta adresiyle bir hizmete kaydolamaz ve ikinci bir faktör ekleyerek e-posta adresinin gerçek sahibini kilitleyemez.

  3. Henüz yapmadıysanız Firebase Apple SDK'sını yükleyin.

    TOTP MFA yalnızca Apple SDK sürümü 10.12.0 ve sonraki sürümlerde ve yalnızca iOS'te desteklenir.

TOTP MFA'yı etkinleştirme

TOTP'yi ikincil faktör olarak etkinleştirmek için Admin SDK kullanın veya proje yapılandırması REST uç noktasını çağırın.

Admin SDK adresini kullanmak için aşağıdakileri yapın:

  1. Henüz yapmadıysanız Firebase Yönetici Node.js SDK'sını yükleyin.

    TOTP MFA yalnızca Firebase Admin Node.js SDK'sının 11.6.0 ve sonraki sürümlerinde desteklenir.

  2. Aşağıdaki komutu çalıştırın:

    import { getAuth } from 'firebase-admin/auth';
    
    getAuth().projectConfigManager().updateProjectConfig(
    {
          multiFactorConfig: {
              providerConfigs: [{
                  state: "ENABLED",
                  totpProviderConfig: {
                      adjacentIntervals: NUM_ADJ_INTERVALS
                  }
              }]
          }
    })
    

    Aşağıdakini değiştirin:

    • NUM_ADJ_INTERVALS: TOTP'lerin kabul edileceği bitişik zaman aralığı aralıkları sayısı (sıfır ile on arasında). Varsayılan değer beştir.

      TOTP'ler, iki taraf (kanıtlayıcı ve doğrulayıcı) aynı zaman aralığında (genellikle 30 saniye) OTP oluşturduğunda aynı şifreyi oluşturmasını sağlar. Ancak taraflar arasındaki saat farkı ve kullanıcı yanıt süresini hesaba katmak için TOTP hizmetini, bitişik pencerelerden gelen TOTP'leri de kabul edecek şekilde yapılandırabilirsiniz.

REST API'yi kullanarak TOTP MFA'yı etkinleştirmek için aşağıdakileri çalıştırın:

curl -X PATCH "https://identitytoolkit.googleapis.com/admin/v2/projects/PROJECT_ID/config?updateMask=mfa" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    -H "X-Goog-User-Project: PROJECT_ID" \
    -d \
    '{
        "mfa": {
          "providerConfigs": [{
            "state": "ENABLED",
            "totpProviderConfig": {
              "adjacentIntervals": NUM_ADJ_INTERVALS
            }
          }]
       }
    }'

Aşağıdakini değiştirin:

  • PROJECT_ID: Proje kimliği.
  • NUM_ADJ_INTERVALS: Sıfır ile on arasında değişen zaman aralığı sayısı. Varsayılan değer beştir.

    TOTP'ler, iki taraf (kanıtlayıcı ve doğrulayıcı) aynı zaman aralığında (genellikle 30 saniye) OTP oluşturduğunda aynı şifreyi oluşturmasını sağlar. Ancak taraflar arasındaki saat farkı ve kullanıcı yanıt süresini hesaba katmak için TOTP hizmetini, bitişik pencerelerden gelen TOTP'leri de kabul edecek şekilde yapılandırabilirsiniz.

Kayıt modeli seçme

Uygulamanızda çok faktörlü kimlik doğrulamasının gerekli olup olmadığını, kullanıcılarınızı nasıl ve ne zaman kaydedeceğinizi seçebilirsiniz. Sık karşılaşılan bazı kalıplar şunlardır:

  • Kayıt işleminin bir parçası olarak kullanıcının ikinci faktörünü kaydedin. Uygulamanız tüm kullanıcılar için çok faktörlü kimlik doğrulaması gerektiriyorsa bu yöntemi kullanın.

  • Kayıt sırasında ikinci bir faktör kaydetme seçeneği sunun. Uygulamanızda çok öğeli kimlik doğrulamasını teşvik etmek ancak zorunlu tutmak istemiyorsanız bu yaklaşımı kullanabilirsiniz.

  • Kaydolma ekranı yerine kullanıcının hesabı veya profil yönetimi sayfasından ikinci bir faktör ekleme olanağı sunun. Bu sayede, kayıt işlemi sırasındaki zorlukları en aza indirirken güvenlik konusunda hassas olan kullanıcılar için çok faktörlü kimlik doğrulamayı kullanmaya devam edebilirsiniz.

  • Kullanıcı, daha yüksek güvenlik şartlarına sahip özelliklere erişmek istediğinde kademeli olarak ikinci bir faktör eklemesini zorunlu kılın.

Kullanıcıları TOTP MFA'ya kaydetme

Uygulamanız için ikinci faktör olarak TOTP çok faktörlü kimlik doğrulamasını etkinleştirdikten sonra, kullanıcıları TOTP çok faktörlü kimlik doğrulamasına kaydetmek üzere istemci tarafı mantığını uygulayın:

  1. Kullanıcının kimliğini yeniden doğrulayın.

  2. Kimliği doğrulanmış kullanıcı için TOTP gizli anahtarı oluşturun:

    // Generate a TOTP secret.
    guard let mfaSession = try? await currentUser.multiFactor.session() else { return }
    guard let totpSecret = try? await TOTPMultiFactorGenerator.generateSecret(with: mfaSession) else { return }
    
    // Display the secret to the user and prompt them to enter it into their
    // authenticator app. (See the next step.)
    
  3. Sırrı kullanıcıya gösterin ve kimlik doğrulayıcı uygulamasına girmesini isteyin:

    // Display this key:
    let secret = totpSecret.sharedSecretKey()
    

    Gizli anahtarı göstermenin yanı sıra, cihazın varsayılan kimlik doğrulama uygulamasına otomatik olarak eklemeyi deneyebilirsiniz. Bunu yapmak için bir Google Authenticator uyumlu anahtar URI'si oluşturun ve openInOTPApp(withQRCodeURL:)'ye iletin:

    let otpAuthUri = totpSecret.generateQRCodeURL(
        withAccountName: currentUser.email ?? "default account",
        issuer: "Your App Name")
    totpSecret.openInOTPApp(withQRCodeURL: otpAuthUri)
    

    Kullanıcı, kimlik doğrulama uygulamasına gizli anahtarını ekledikten sonra TOTP'ler oluşturulmaya başlar.

  4. Kullanıcıdan, kimlik doğrulama uygulaması tarafından gösterilen TOTP'yi yazmasını isteyin ve MFA kaydını tamamlamak için bunu kullanın:

    // Ask the user for a verification code from the authenticator app.
    let verificationCode = // Code from user input.
    
    // Finalize the enrollment.
    let multiFactorAssertion = TOTPMultiFactorGenerator.assertionForEnrollment(
        with: totpSecret,
        oneTimePassword: verificationCode)
    do {
        try await currentUser.multiFactor.enroll(
            with: multiFactorAssertion,
            displayName: "TOTP")
    } catch {
        // Wrong or expired OTP. Re-prompt the user.
    }
    

Kullanıcıların oturumunu ikinci faktörle açma

Kullanıcıların TOTP çok faktörlü kimlik doğrulamasıyla oturum açması için aşağıdaki kodu kullanın:

  1. MFA kullanmıyormuş gibi signIn(with...:) yöntemlerinden birini çağırın (örneğin, signIn(withEmail:password:)). Yöntem, secondFactorRequired koduyla bir hata verirse uygulamanızın MFA akışını başlatın.

    do {
        let authResult = try await Auth.auth().signIn(withEmail: email, password: password)
    
        // If the user is not enrolled with a second factor and provided valid
        // credentials, sign-in succeeds.
    
        // (If your app requires MFA, this could be considered an error
        // condition, which you would resolve by forcing the user to enroll a
        // second factor.)
    
        // ...
    } catch let error as AuthErrorCode where error.code == .secondFactorRequired {
        // Initiate your second factor sign-in flow. (See next step.)
        // ...
    } catch {
        // Other auth error.
        throw error
    }
    
  2. Uygulamanızın çok faktörlü kimlik doğrulama akışında, kullanıcıdan önce kullanmak istediği ikinci faktörü seçmesi istenir. Bir MultiFactorResolver örneğinin hints mülkünü inceleyerek desteklenen ikinci faktörlerin listesini alabilirsiniz:

    let mfaKey = AuthErrorUserInfoMultiFactorResolverKey
    guard let resolver = error.userInfo[mfaKey] as? MultiFactorResolver else { return }
    let enrolledFactors = resolver.hints.map(\.displayName)
    
  3. Kullanıcı TOTP'yi kullanmayı seçerse Authenticator uygulamasında gösterilen TOTP'yi yazmasını ve oturum açmak için kullanmasını isteyin:

    let multiFactorInfo = resolver.hints[selectedIndex]
    switch multiFactorInfo.factorID {
    case TOTPMultiFactorID:
        let otpFromAuthenticator = // OTP typed by the user.
        let assertion = TOTPMultiFactorGenerator.assertionForSignIn(
            withEnrollmentID: multiFactorInfo.uid,
            oneTimePassword: otpFromAuthenticator)
        do {
            let authResult = try await resolver.resolveSignIn(with: assertion)
        } catch {
            // Wrong or expired OTP. Re-prompt the user.
        }
    default:
        return
    }
    

TOTP MFA kaydını iptal etme

Bu bölümde, kullanıcının TOTP çok faktörlü kimlik doğrulamasından kaydını iptal etmesi durumunda nasıl işlem yapılacağı açıklanmaktadır.

Birden fazla MFA seçeneğine kaydolan kullanıcılar, en son etkinleştirilen seçenekten kaydını iptal ederse auth/user-token-expired alır ve oturumları kapatılır. Kullanıcının tekrar oturum açması ve mevcut kimlik bilgilerini (ör. e-posta adresi ve şifre) doğrulaması gerekir.

Kullanıcının kaydını iptal etmek, hatayı işlemek ve yeniden kimlik doğrulamayı tetiklemek için aşağıdaki kodu kullanın:

guard let currentUser = Auth.auth().currentUser else { return }

// Prompt the user to select a factor to unenroll, from this array:
currentUser.multiFactor.enrolledFactors

// ...

// Unenroll the second factor.
let multiFactorInfo = currentUser.multiFactor.enrolledFactors[selectedIndex]
do {
    try await currentUser.multiFactor.unenroll(with: multiFactorInfo)
} catch let error as AuthErrorCode where error.code == .invalidUserToken {
    // Second factor unenrolled, but the user was signed out. Re-authenticate
    // them.
}

Sırada ne var?