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

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 JavaScript SDK'sı.

    TOTP MFA yalnızca modüler Web SDK'sının v9.19.1 ve bölümünü ziyaret edin.

TOTP MFA'yı etkinleştir

TOTP'yi ikinci faktör olarak etkinleştirmek için Yönetici SDK'sını 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. Gerekli MFA sınıflarını ve işlevlerini içe aktarın:

    import {
      multiFactor,
      TotpMultiFactorGenerator,
      TotpSecret,
      getAuth,
    } from "firebase/auth";
    
  2. Kullanıcının kimliğini yeniden doğrulayın.

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

    // Generate a TOTP secret.
    const multiFactorSession = await multiFactor(currentUser).getSession();
    const totpSecret = await TotpMultiFactorGenerator.generateSecret(
      multiFactorSession
    );
    
  4. Sırrı kullanıcıya gösterin ve bunu kullanıcı hesabına girmesini isteyin. kimlik doğrulayıcı uygulamasıdır.

    Kimlik doğrulayıcı uygulamaların çoğu, kullanıcılar yeni TOTP gizli anahtarlarını temsil eden QR kodunu tarama. Google Authenticator uyumlu anahtar URI'si. Bu amaçla bir QR kodu oluşturmak için URI'yı generateQrCodeUrl() ve ardından cihazınızın QR kodu kitaplığını kullanarak kodlayın seçim. Örneğin:

    const totpUri = totpSecret.generateQrCodeUrl(
        currentUser.email,
        "Your App's Name"
    );
    await QRExampleLib.toCanvas(totpUri, qrElement);
    

    QR kodu görüntüleyip görüntülememenize bakılmaksızın gizli anahtarı her zaman gösterin. QR kodlarını okuyamayan kimlik doğrulayıcı uygulamaları desteklemek için:

    // Also display this key:
    const secret = totpSecret.secretKey;
    

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

  5. Kullanıcıdan kimlik doğrulayıcı uygulamasında gösterilen TOTP'yi yazmasını ve MFA kaydını tamamlamak için bunu kullanın:

    // Ask the user for a verification code from the authenticator app.
    const verificationCode = // Code from user input.
    
    // Finalize the enrollment.
    const multiFactorAssertion = TotpMultiFactorGenerator.assertionForEnrollment(
      totpSecret,
      verificationCode
    );
    await multiFactor(currentUser).enroll(multiFactorAssertion, mfaDisplayName);
    

İ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. Gerekli MFA sınıflarını ve işlevlerini içe aktarın:

    import {
        getAuth,
        getMultiFactorResolver,
        TotpMultiFactorGenerator,
    } from "firebase/auth";
    
  2. MFA kullanmıyorsanız signInWith yöntemlerinden birini çağırın. (Örneğin, signInWithEmailAndPassword().) Yöntem bir auth/multi-factor-auth-required hata, uygulamanızın MFA akışını başlatın.

    try {
        const userCredential = await signInWithEmailAndPassword(
            getAuth(),
            email,
            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 (error) {
        switch (error.code) {
            case "auth/multi-factor-auth-required":
                // Initiate your second factor sign-in flow. (See next step.)
                // ...
                break;
            case ...:  // Handle other errors, such as wrong passwords.
                break;
        }
    }
    
  3. 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:

    const mfaResolver = getMultiFactorResolver(getAuth(), error);
    const enrolledFactors = mfaResolver.hints.map(info => info.displayName);
    
  4. Kullanıcı TOTP kullanmayı tercih ederse, görüntülenen TOTP'yi yazmasını isteyin. kullanarak oturum açabilir:

    switch (mfaResolver.hints[selectedIndex].factorId) {
        case TotpMultiFactorGenerator.FACTOR_ID:
            const otpFromAuthenticator = // OTP typed by the user.
            const multiFactorAssertion =
                TotpMultiFactorGenerator.assertionForSignIn(
                    mfaResolver.hints[selectedIndex].uid,
                    otpFromAuthenticator
                );
            try {
                const userCredential = await mfaResolver.resolveSignIn(
                    multiFactorAssertion
                );
                // Successfully signed in!
            } catch (error) {
                // Invalid or expired OTP.
            }
            break;
        case PhoneMultiFactorGenerator.FACTOR_ID:
            // Handle SMS second factor.
            break;
        default:
            // Unsupported second factor?
            break;
    }
    

TOTP MFA kaydını iptal et

Bu bölümde, bir kullanıcının TOTP MFA kaydını iptal etmesi durumunda nasıl işlem 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:

import {
    EmailAuthProvider,
    TotpMultiFactorGenerator,
    getAuth,
    multiFactor,
    reauthenticateWithCredential,
} from "firebase/auth";

try {
    // Unenroll from TOTP MFA.
    await multiFactor(currentUser).unenroll(mfaEnrollmentId);
} catch  (error) {
    if (error.code === 'auth/user-token-expired') {
        // 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.

        const credential = EmailAuthProvider.credential(email, password);
        await reauthenticateWithCredential(
            currentUser,
            credential
        );
    }
}

Sırada ne var?