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ğrulaması (MFA) ekleyebilirsiniz.

Firebase Authentication with Identity Platform, TOTP'yi MFA için ek bir öğe 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. Kullanıcıların bu kodu oluşturmak için Google Authenticator gibi geçerli TOTP kodları oluşturabilen bir kimlik doğrulayıcı uygulaması kullanması 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 çok faktörlü kimlik doğrulamayı 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. ÇFDO için e-posta doğrulaması gerekir. Bu sayede kötü niyetli kişiler, kendilerine ait olmayan bir e-posta adresiyle hizmete kaydolup ikinci bir faktör ekleyerek e-posta adresinin asıl sahibinin hesabına erişmesini engelleyemez.

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

    TOTP MFA yalnızca Android SDK sürümü 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 simgesini 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ığı sayısı (sıfır ila on). 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ğlayarak çalışır. Ancak taraflar arasındaki saat farkını ve insan yanıt süresini hesaba katmak için TOTP hizmetini, bitişik pencerelerdeki 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ırdan ona kadar olan 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ğlayarak çalışır. Ancak taraflar arasındaki saat farkını ve insan yanıt süresini hesaba katmak için TOTP hizmetini, bitişik pencerelerdeki 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. Sık karşılaşılan bazı kalıplar şunlardır:

  • Kullanıcının ikinci faktörünü kayıt sırasında 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 bir faktör kaydetmek için atlanabilir bir seçenek sunun. Uygulamanızda çok öğeli kimlik doğrulamayı 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 bir faktör ekleme olanağı sunun. Bu sayede, kayıt sürecinde sorun yaşama ihtimali en aza indirilirken güvenliğe duyarlı kullanıcılar için çok öğeli kimlik doğrulama özelliği kullanılmaya devam edebilir.

  • Kullanıcı, daha fazla güvenlik gerektiren özelliklere erişmek istediğinde ikinci faktörün kademeli olarak eklenmesini 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 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. Sırrı kullanıcıya gösterin ve kimlik doğrulama uygulamasına girmesini isteyin:

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

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

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

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

  4. Kullanıcıdan, Authenticator uygulaması tarafından gösterilen TOTP'yi yazmasını ve MFA kaydını tamamlamak için 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 etmenle 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. Çok faktörlü kimlik doğrulama kullanmıyormuş gibi signInWith yöntemlerinden birini arayın. (Örneğin, signInWithEmailAndPassword().) Yöntem bir FirebaseAuthMultiFactorException oluşturursa uygulamanızın çok faktörlü kimlik doğrulama 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 MFA akışı, kullanıcıdan önce kullanmak istediği ikinci faktörü seçmesini istemelidir. Desteklenen ikinci faktörlerin listesini, bir MultiFactorResolver örneğinin hints özelliğini inceleyerek edinebilirsiniz:

    val enrolledFactors = exception.resolver.hints.map { it.displayName }
    
  3. Kullanıcı TOTP'yi kullanmayı seçerse kimlik doğrulama uygulamasında gösterilen TOTP'yi yazmasını ve oturum açmak için 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, kullanıcının TOTP MFA'dan kaydını silme işleminin nasıl ele alınacağı açıklanmaktadır.

Bir kullanıcı birden fazla MFA seçeneğine kaydolduysa ve en son etkinleştirilen seçeneğin kaydını silerse auth/user-token-expired alır ve oturumu 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ı silmek, 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?