Android uygulamanıza TOTP çok öğeli kimlik doğrulaması ekleme

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

Firebase Authentication with Identity Platform, TOTP'yi MFA için ek bir faktör olarak kullanmanıza olanak tanır. Bu özelliği etkinleştirdiğinizde, uygulamanızda oturum açmaya çalışan kullanıcılara TOTP isteği gösterilir. Bu kodu oluşturmak için Google Authenticator gibi geçerli TOTP kodları oluşturabilen bir kimlik doğrulayıcı uygulama kullanmaları gerekir.

Başlamadan önce

  1. Çok faktörlü kimlik doğrulamayı destekleyen en az bir sağlayıcıyı etkinleştirin. Aşağıdakiler hariç tüm sağlayıcıların ÇFA'yı desteklediğini unutmayın:

    • Telefonla kimlik doğrulama
    • Anonim kimlik doğrulama
    • Özel kimlik doğrulama 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şilerin, kendilerine ait olmayan bir e-posta adresiyle hizmete kaydolması ve ardından ikinci faktör ekleyerek e-posta adresinin gerçek sahibini engellemesi önlenir.

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

    TOTP MFA yalnızca Android SDK'sı v22.1.0 ve sonraki sürümlerde desteklenir.

TOTP MFA'yı etkinleştirme

TOTP'yi ikinci 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 özelliğini kullanmak için aşağıdakileri yapın:

  1. Henüz yapmadıysanız Firebase Admin 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ıklarının sayısı (0-10). Varsayılan değer beştir.

      TOTP'ler, iki taraf (kanıtlayan ve doğrulayan) aynı zaman aralığında (genellikle 30 saniye) OTP oluşturduğunda aynı şifreyi oluşturmalarını sağlayarak çalışır. Ancak taraflar arasındaki saat farkını ve insan 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: Zaman aralığı sayısı (0 ile 10 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şturmalarını sağlayarak çalışır. Ancak taraflar arasındaki saat farkını ve insan 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ızın çok öğeli kimlik doğrulaması gerektirip gerektirmediğini ve kullanıcılarınızı nasıl ve ne zaman kaydedeceğinizi seçebilirsiniz. Yaygın kalıplardan bazıları şunlardır:

  • Kayıt sırasında kullanıcının ikinci faktörünü kaydedin. Uygulamanız tüm kullanıcılar için çok öğeli kimlik doğrulaması gerektiriyorsa bu yöntemi kullanın.

  • Kayıt sırasında ikinci faktör eklemek için atlanabilir bir seçenek sunun. Uygulamanızda çok öğeli kimlik doğrulamasını zorunlu kılmak yerine teşvik etmek istiyorsanız bu yaklaşımı kullanabilirsiniz.

  • Kayıt ekranı yerine kullanıcının hesap veya profil yönetimi sayfasından ikinci faktör ekleme imkanı sunun. Bu sayede, kayıt sürecindeki zorluklar en aza indirilirken güvenliğe önem veren kullanıcılar için çok öğeli kimlik doğrulama kullanılabilir hale getirilir.

  • Kullanıcı, daha yüksek güvenlik şartları olan ö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 MFA'yı etkinleştirdikten sonra, kullanıcıları TOTP MFA'ya kaydetmek için 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 bir TOTP gizli anahtarı oluşturun:

    // Generate a TOTP secret.
    Firebase.auth.currentUser.multiFactor.session
        .addOnSuccessListener { multiFactorSession ->
            TotpMultiFactorGenerator.generateSecret(multiFactorSession)
                .addOnSuccessListener { totpSecret ->
                    // Display the secret to the user and prompt them to
                    // enter it into their authenticator app. (See the next
                    // step.)
                }
        }
    
  3. Gizli anahtarı kullanıcıya gösterin ve kimlik doğrulayıcı uygulamasına girmesini isteyin:

    // Display this key:
    val secret = totpSecret.sharedSecretKey
    

    Gizli anahtarı görüntülemenin yanı sıra, anahtarı cihazın varsayılan kimlik doğrulayıcı uygulamasına otomatik olarak eklemeyi deneyebilirsiniz. Bunun için Google Authenticator ile uyumlu bir anahtar URI'si oluşturun ve bunu openInOtpApp() yöntemine iletin:

    val qrCodeUri = totpSecret.generateQrCodeUrl(
        currentUser.email ?: "default account",
        "Your App Name")
    totpSecret.openInOtpApp(qrCodeUri)
    

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

  4. Kullanıcıdan, kimlik doğrulayıcı uygulamasında gösterilen TOTP'yi yazmasını ve MFA kaydını tamamlamak için bu kodu kullanmasını isteyin:

    // Ask the user for a verification code from the authenticator app.
    val verificationCode = // Code from user input.
    
    // Finalize the enrollment.
    val multiFactorAssertion = TotpMultiFactorGenerator
        .getAssertionForEnrollment(totpSecret, verificationCode)
    Firebase.auth.currentUser.multiFactor.enroll(multiFactorAssertion, "TOTP")
        .addOnSuccessListener {
            // Enrollment complete.
        }
    

Kullanıcıların ikinci bir faktörle oturum açmasını sağlama

Kullanıcıların TOTP MFA ile oturum açmasını sağlamak için aşağıdaki kodu kullanın:

  1. MFA kullanmıyormuş gibi signInWith yöntemlerinden birini çağırın. (Örneğin, signInWithEmailAndPassword().) Yöntem bir FirebaseAuthMultiFactorException hatası verirse uygulamanızın MFA akışını başlatın.

    Firebase.auth.signInWithEmailAndPassword(email, password)
        .addOnSuccessListener { result ->
            // 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.)
    
            // ...
        }
        .addOnFailureListener { exception ->
            when (exception) {
                is FirebaseAuthMultiFactorException -> {
                    // Initiate your second factor sign-in flow. (See next step.)
                    // ...
                }
            }
        }
    
  2. Uygulamanızın ÇFA akışı, ilk olarak kullanıcıdan kullanmak istediği ikinci faktörü seçmesini istemelidir. Bir MultiFactorResolver örneğinin hints özelliğini inceleyerek desteklenen ikinci faktörlerin listesini alabilirsiniz:

    val enrolledFactors = exception.resolver.hints.map { it.displayName }
    
  3. Kullanıcı TOTP kullanmayı seçerse kimlik doğrulayıcı uygulamasında gösterilen TOTP'yi yazmasını ve oturum açmak için bu kodu kullanmasını isteyin:

    when (exception.resolver.hints[selectedIndex].factorId) {
        TotpMultiFactorGenerator.FACTOR_ID -> {
            val otpFromAuthenticator = // OTP typed by the user.
            val assertion = TotpMultiFactorGenerator.getAssertionForSignIn(
                exception.resolver.hints[selectedIndex].uid,
                otpFromAuthenticator
            )
            exception.resolver.resolveSignIn(assertion)
                .addOnSuccessListener { result ->
                    // Successfully signed in!
                }
                .addOnFailureListener { resolveError ->
                    // Invalid or expired OTP.
                }
        }
        PhoneMultiFactorGenerator.FACTOR_ID -> {
            // Handle SMS second factor.
        }
    }
    

TOTP MFA kaydını iptal etme

Bu bölümde, bir kullanıcının TOTP MFA kaydını iptal etme işleminin nasıl yapılacağı açıklanmaktadır.

Birden fazla ÇFA seçeneğine kaydolan bir kullanıcı, en son etkinleştirilen seçeneğin kaydını iptal ederse auth/user-token-expired alır ve çıkış yapar. 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:

Firebase.auth.currentUser.multiFactor.unenroll(mfaEnrollmentId)
    .addOnSuccessListener {
        // Second factor unenrolled.
    }
    .addOnFailureListener { exception ->
        when (exception) {
            is FirebaseAuthInvalidUserException -> {
                // Second factor unenrolled. If the user was signed out, re-authenticate
                // them.

                // For example, if they signed in with a password, prompt them to
                // provide it again, then call `reauthenticateWithCredential()` as shown
                // below.
                val credential = EmailAuthProvider.getCredential(email, password)
                currentUser.reauthenticate(credential)
                    .addOnSuccessListener { 
                        // Success!
                    }
                    .addOnFailureListener { 
                        // Bad email address and password combination.
                    }
            }
        }
    }

Sırada ne var?