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

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 Android SDK'sını yükleyin.

    TOTP MFA yalnızca Android SDK sürümü 22.1.0 ve sonraki sürümlerde 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.
    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ğrulayıcı uygulamasına girmesini isteyin:

    // Display this key:
    val 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()'ye iletin:

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

    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.
    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 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 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 ç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:

    val enrolledFactors = exception.resolver.hints.map { it.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:

    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 ç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:

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?