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

Identity Platform ile Firebase Authentication'a yükselttiyseniz zamana dayalı tek kullanımlık şifre ekleyebilirsiniz (TOTP) ile çok öğeli kimlik doğrulaması (MFA) eklemeniz gerekir.

Identity Platform ile Firebase Authentication, MFA için ek bir faktör olarak TOTP kullanmanıza olanak tanır. Google Takvim widget'ını uygulamanızda oturum açmaya çalışan kullanıcılar, TOTP Bunu oluşturmak için aşağıdakileri oluşturabilen bir kimlik doğrulayıcı uygulama kullanmaları gerekir: Google Authenticator gibi geçerli TOTP kodları.

Başlamadan önce

  1. MFA'yı destekleyen en az bir sağlayıcıyı etkinleştirin. Tüm sağlayıcıların hariç:

    • Telefonla kimlik doğrulama
    • Anonim kimlik doğrulama
    • Özel yetkilendirme jetonları
    • Apple Oyun Merkezi
  2. Uygulamanızın kullanıcı e-posta adreslerini doğruladığından emin olun. MFA için e-posta gerekir doğrulama. Bu, kötü niyetli kişilerin bir hizmete kaydolmasını engeller önce size ait olmayan bir e-posta adresi ile aktarabilir ve sonra da ekleyerek e-posta adresinin sahibi olduğunu doğrulayabilirsiniz.

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

    TOTP MFA yalnızca Android SDK 22.1.0 sürümü ve sonraki sürümler.

TOTP MFA'yı etkinleştir

TOTP'yi ikinci faktör olarak etkinleştirmek için Yönetici SDK'sini kullanın veya projeyi çağırın. yapılandırma REST uç noktası.

Yönetici SDK'sını kullanmak için aşağıdakileri yapın:

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

    TOTP MFA yalnızca Firebase Admin Node.js SDK'sının 11.6.0 ve üzeri sürümlerinde desteklenir bölümünü ziyaret edin.

  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: Bitişik Sıfır ile on arasında olmak üzere TOTP'lerin kabul edileceği zaman aralığı aralıkları. İlgili içeriği oluşturmak için kullanılan varsayılan olarak beş değer.

      TOTP'ler, iki tarafın (kanıt ve kanıtlayan taraf) geçerli olmasını sağlayarak doğrulayıcı) aynı zaman aralığında (genellikle 30 saniye) OTP'ler oluşturur uzunsa) aynı şifreyi oluştururlar. Ancak, saate uyum sağlamak için gerçek zamanlı yanıt verme süresini baz alırsak, TOTP'yi üzerinden gelen TOTP'leri de kabul etmesini sağlar.

REST API'yi kullanarak TOTP MFA'yı etkinleştirmek için aşağıdaki komutu ç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ı olduğunu unutmayın. Varsayılan değer beş.

    TOTP'ler, iki tarafın (kanıt ve kanıtlayan taraf) geçerli olmasını sağlayarak doğrulayıcı) aynı zaman aralığında (genellikle 30 saniye) OTP'ler oluşturur uzunsa) aynı şifreyi oluştururlar. Ancak, saate uyum sağlamak için gerçek zamanlı yanıt verme süresini baz alırsak, TOTP'yi üzerinden gelen TOTP'leri de kabul etmesini sağlar.

Kayıt kalıbı seçin

Uygulamanızın çok öğeli kimlik doğrulaması gerektirip gerektirmediğini ve ve kullanıcılarınızı ne zaman kaydetmeniz gerektiği. Yaygın görülen bazı kalıplar şunlardır:

  • Kullanıcının ikinci faktörünü kayıt işleminin bir parçası olarak kaydedin. Bunu kullan yöntemini kullanın.

  • Kayıt sırasında ikinci bir faktör kaydettirmek için atlanabilir bir seçenek sunun. Şu durumda: Uygulamanızda çok öğeli kimlik doğrulamayı teşvik etmek isterseniz ancak zorunlu değilse, bu yaklaşımı kullanabilir.

  • Kullanıcının hesabından veya profilinden ikinci bir faktör ekleme olanağı sağlama yönetim sayfasını ziyaret edebilirsiniz. Böylece, proje yürütme aşamasında kayıt sürecinde, çok öğeli kimlik doğrulamasını güvenlik açısından hassas kullanıcılar tarafından kullanılabilir.

  • Kullanıcı erişim istediğinde ikinci bir faktör eklemeyi zorunlu kıl yeni özelliklerden yararlanabilirsiniz.

Kullanıcıları TOTP MFA'ya kaydetme

Uygulamanızda ikinci faktör olarak TOTP MFA'yı etkinleştirdikten sonra istemci taraflı kullanıcıları TOTP MFA'ya kaydetme mantığı:

  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. Sırrı kullanıcıya gösterin ve bunu kullanıcı hesabına girmesini isteyin. kimlik doğrulayıcı uygulama:

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

    Gizli anahtarı görüntülemenin yanı sıra, aynı zamanda cihazın varsayılan kimlik doğrulayıcı uygulamasına ekleyin. Bunu yapmak için bir Google Authenticator uyumlu anahtar URI'si, openInOtpApp() adresine ilet:

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

    Kullanıcı, kimlik doğrulayıcı uygulamasına sırrını ekledikten sonra uygulama başlatılır. TOTP oluşturuyor.

  4. Kullanıcıdan kimlik doğrulayıcı 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.
        }
    

İkinci faktörle kullanıcıların oturumunu açma

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

  1. MFA kullanmıyorsanız signInWith yöntemlerinden birini çağırın. (Örneğin, signInWithEmailAndPassword().) Yöntem bir FirebaseAuthMultiFactorException, 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 MFA akışı öncelikle kullanıcıdan ikinci faktörü seçmesini istemelidir etkili bir yoludur. Desteklenen ikinci faktörlerin bir listesini MultiFactorResolver örneğinin hints özelliği inceleniyor:

    val enrolledFactors = exception.resolver.hints.map { it.displayName }
    
  3. Kullanıcı TOTP kullanmayı seçerse ondan görüntülenen TOTP'yi yazmasını isteyin kullanarak oturum açabilir:

    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 et

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

Bir kullanıcı birden çok MFA seçeneğine kaydolduysa ve kaydını iptal etmesi halinde en son etkinleştirilen seçenekte auth/user-token-expired bir auth/user-token-expired ve oturum kapatıldı. Kullanıcının tekrar oturum açması ve Mevcut kimlik bilgileri (ör. e-posta adresi ve şifre).

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

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?