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

Firebase Authentication with Identity Platform'a yükseltme yaptıysanız uygulamanıza zaman tabanlı tek kullanımlık şifre (TOTP) çok öğeli kimlik doğrulaması (MFA) ekleyebilirsiniz.

Kimlik Platformu ile Firebase Kimlik Doğrulaması, MFA için ek bir 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 bir TOTP isteği görür. Bunları oluşturmak için, geçerli TOTP kodları oluşturabilen Google Authenticator gibi bir kimlik doğrulayıcı 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 kimlik doğrulama jetonları
    • Apple Oyun Merkezi
  2. Uygulamanızın kullanıcı e-posta adreslerini doğruladığından emin olun. MFA için e-posta doğrulaması gerekir. Bu, kötü amaçlı kişilerin sahip olmadıkları bir e-posta adresiyle bir hizmete kaydolmalarını ve ardından ikinci bir faktör ekleyerek e-posta adresinin gerçek sahibini ele geçirmelerini önler.

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

    TOTP MFA, yalnızca modüler Web SDK'sı v9.19.1 ve üzeri sürümlerde desteklenir.

TOTP MFA'yı etkinleştir

İkinci faktör olarak TOTP'yi etkinleştirmek için Yönetici SDK'sını kullanın veya proje yapılandırması REST uç noktasını çağırın.

Yönetici SDK'sini 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 üzeri 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, sıfırdan ona kadar olan bitişik zaman aralığı aralıklarının sayısı. Varsayılan değer beştir.

      TOTP'ler, iki tarafın (kanıtlayıcı ve doğrulayıcı) aynı zaman aralığı içinde (genellikle 30 saniye uzunluğunda) OTP'leri oluşturduklarında aynı şifreyi oluşturmalarını sağlayarak çalışır. Bununla birlikte, taraflar arasındaki saat kaymasını ve gerçek kişilerin 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ğı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: Sıfırdan ona kadar olan zaman aralığı aralıklarının sayısıdır. Varsayılan değer beştir.

    TOTP'ler, iki tarafın (kanıtlayıcı ve doğrulayıcı) aynı zaman aralığı içinde (genellikle 30 saniye uzunluğunda) OTP'leri oluşturduklarında aynı şifreyi oluşturmalarını sağlayarak çalışır. Bununla birlikte, taraflar arasındaki saat kaymasını ve gerçek kişilerin yanıt süresini hesaba katmak için TOTP hizmetini, bitişik pencerelerden gelen TOTP'leri de kabul edecek şekilde yapılandırabilirsiniz.

Bir kayıt kalıbı seçin

Uygulamanızın çok öğeli kimlik doğrulaması gerektirip gerektirmediğini, kullanıcılarınızı nasıl ve ne zaman kaydedeceğinizi seçebilirsiniz. Bazı yaygın kalıplar şunlardır:

  • Kullanıcının ikinci faktörünü kayıt işleminin bir parçası olarak 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 unsuru kaydetmek için atlanabilir bir seçenek sunmak. Uygulamanızda çok öğeli kimlik doğrulamasını teşvik etmek istiyor ancak zorunlu kılmak istemiyorsanız bu yaklaşımı kullanabilirsiniz.

  • Kayıt ekranı yerine kullanıcının hesabından veya profil yönetimi sayfasından ikinci bir faktör ekleme imkanı sağlayın. Bu sayede, kayıt sürecinde yaşanabilecek zorluklar en aza indirilirken güvenlik açısından hassas kullanıcılar için de çok öğeli kimlik doğrulaması kullanıma hazır olur.

  • Kullanıcı artırılmış güvenlik gereksinimleri olan özelliklere erişmek istediğinde aşamalı olarak ikinci bir faktör eklemeyi 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ığı uygulayın:

  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. Gizli anahtarı kullanıcıya gösterin ve bunu kullanıcının kimlik doğrulayıcı uygulamasına girmesini isteyin.

    Birçok kimlik doğrulayıcı uygulamada kullanıcılar, Google Authenticator ile uyumlu anahtar URI'sini temsil eden bir QR kodunu tarayarak yeni TOTP gizli anahtarlarını hızlı bir şekilde ekleyebilir. Bu amaçla bir QR kodu oluşturmak için generateQrCodeUrl() ile URI oluşturup daha sonra istediğiniz QR kodu kitaplığını kullanarak kodlayın. Örnek:

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

    QR kodu gösterip göstermemenizden bağımsız olarak, QR kodlarını okuyamayan kimlik doğrulayıcı uygulamaları desteklemek için gizli anahtarı her zaman görüntüleyin:

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

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

  5. Kullanıcıdan, kimlik doğrulayıcı uygulamasında görüntülenen TOTP'yi yazmasını ve MFA kaydını tamamlamak için bunu kullanmasını isteyin:

    // 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

TOTP MFA ile kullanıcıların oturumunu açmak 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. signInWith- yöntemlerinden birini, MFA'yı kullanmıyormuş gibi çağırın. (Örneğin, signInWithEmailAndPassword().) Yöntem auth/multi-factor-auth-required hatası verirse 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ışı ilk olarak kullanıcıdan, kullanmak istediği ikinci faktörü seçmesini istemelidir. MultiFactorResolver örneğinin hints özelliğini inceleyerek desteklenen ikinci faktörlerin listesini edinebilirsiniz:

    const mfaResolver = getMultiFactorResolver(getAuth(), error);
    const enrolledFactors = mfaResolver.hints.map(info => info.displayName);
    
  4. Kullanıcı TOTP kullanmayı tercih ederse kimlik doğrulayıcı uygulamasında görüntülenen TOTP'yi yazmasını ve oturum açmak için kullanmasını isteyin:

    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 etme işleminin nasıl yapılacağı açıklanmaktadır.

Bir kullanıcı birden fazla MFA seçeneğine kaydolmuşsa ve en son etkinleştirilen seçenekteki kaydını silerse auth/user-token-expired alır ve oturumu kapatılır. Kullanıcı tekrar oturum açmalı ve mevcut kimlik bilgilerini (örneğin, e-posta adresi ve şifre) doğrulamalıdır.

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:

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?