Firebase Kimlik Doğrulamasını engelleme işlevleriyle genişletin


Engelleme işlevleri, bir kullanıcının uygulamanıza kaydolmasının veya oturum açmasının sonucunu değiştiren özel kodu çalıştırmanıza olanak tanır. Örneğin, bir kullanıcının belirli ölçütleri karşılamaması durumunda kimlik doğrulamasını engelleyebilir veya kullanıcının bilgilerini istemci uygulamanıza göndermeden önce güncelleyebilirsiniz.

Sen başlamadan önce

Engelleme işlevlerini kullanmak için Firebase projenizi Identity Platform ile Firebase Authentication'a yükseltmeniz gerekir. Henüz yükseltme yapmadıysanız, önce bunu yapın.

Engelleme işlevlerini anlama

İki olay için engelleme işlevlerini kaydedebilirsiniz:

  • beforeCreate : Firebase Authentication veritabanına yeni bir kullanıcı kaydedilmeden ve istemci uygulamanıza bir belirteç döndürülmeden önce tetiklenir.

  • beforeSignIn : Kullanıcının kimlik bilgileri doğrulandıktan sonra ancak Firebase Authentication'ın istemci uygulamanıza bir kimlik belirteci döndürmesinden önce tetiklenir. Uygulamanız çok faktörlü kimlik doğrulamayı kullanıyorsa işlev, kullanıcı ikinci faktörünü doğruladıktan sonra tetiklenir. Yeni bir kullanıcı oluşturmanın beforeCreate ek olarak beforeSignIn de tetiklediğini unutmayın.

Engelleme işlevlerini kullanırken aşağıdakileri aklınızda bulundurun:

  • İşleviniz 7 saniye içinde yanıt vermelidir. 7 saniye sonra Firebase Authentication bir hata döndürür ve istemci işlemi başarısız olur.

  • 200 dışındaki HTTP yanıt kodları istemci uygulamalarınıza aktarılır. İstemci kodunuzun, işlevinizin döndürebileceği tüm hataları işlediğinden emin olun.

  • İşlevler, kiracının içerdiğiler de dahil olmak üzere projenizdeki tüm kullanıcılar için geçerlidir. Firebase Authentication, işlevinizdeki kullanıcılar hakkında, ait oldukları kiracılar da dahil olmak üzere bilgi sağlar, böylece buna göre yanıt verebilirsiniz.

  • Başka bir kimlik sağlayıcıyı bir hesaba bağlamak, kayıtlı beforeSignIn işlevlerini yeniden tetikler.

  • Anonim ve özel kimlik doğrulama, engelleme işlevlerini tetiklemez.

Engelleme işlevi dağıtma

Özel kodunuzu kullanıcı kimlik doğrulama akışlarına eklemek için engelleme işlevlerini dağıtın. Engelleme işlevleriniz dağıtıldıktan sonra, kimlik doğrulamanın ve kullanıcı oluşturmanın başarılı olması için özel kodunuzun başarıyla tamamlanması gerekir.

Bir engelleme işlevini, herhangi bir işlevi dağıttığınız şekilde dağıtırsınız. (ayrıntılar için Cloud Functions Başlarken sayfasına bakın). Özetle:

  1. beforeCreate olayını, beforeSignIn olayını veya her ikisini birden işleyen Bulut İşlevlerini yazın.

    Örneğin, başlamak için aşağıdaki işlem gerektirmeyen işlevleri index.js dosyasına ekleyebilirsiniz:

    const functions = require('firebase-functions');
    
    exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
      // TODO
    });
    
    exports.beforeSignIn = functions.auth.user().beforeSignIn((user, context) => {
      // TODO
    });
    

    Yukarıdaki örneklerde özel kimlik doğrulama mantığının uygulanması ihmal edilmiştir. Engelleme işlevlerinizi nasıl uygulayacağınızı öğrenmek için aşağıdaki bölümlere ve belirli örnekler için Genel senaryolara bakın.

  2. Firebase CLI'yi kullanarak işlevlerinizi dağıtın:

    firebase deploy --only functions
    

    İşlevlerinizi her güncellediğinizde yeniden dağıtmanız gerekir.

Kullanıcı ve bağlam bilgilerini alma

beforeSignIn ve beforeCreate olayları, kullanıcının oturum açmasıyla ilgili bilgileri içeren User ve EventContext nesnelerini sağlar. Bir işlemin devam etmesine izin verilip verilmeyeceğini belirlemek için kodunuzda bu değerleri kullanın.

User nesnesinde bulunan özelliklerin listesi için UserRecord API başvurusuna bakın.

EventContext nesnesi aşağıdaki özellikleri içerir:

İsim Tanım Örnek
locale Uygulama yerel ayarı. Yerel ayarı, istemci SDK'sını kullanarak veya yerel ayar başlığını REST API'ye ileterek ayarlayabilirsiniz. fr veya sv-SE
ipAddress Son kullanıcının kaydolduğu veya oturum açtığı cihazın IP adresi. 114.14.200.1
userAgent Engelleme işlevini tetikleyen kullanıcı aracısı. Mozilla/5.0 (X11; Linux x86_64)
eventId Etkinliğin benzersiz tanımlayıcısı. rWsyPtolplG2TBFoOkkgyg
eventType Etkinlik türü. Bu, beforeSignIn veya beforeCreate gibi etkinlik adı ve Google veya e-posta/şifre gibi kullanılan ilişkili oturum açma yöntemi hakkında bilgi sağlar. providers/cloud.auth/eventTypes/user.beforeSignIn:password
authType Her zaman USER . USER
resource Firebase Authentication projesi veya kiracısı. projects/ project-id /tenants/ tenant-id
timestamp Etkinliğin tetiklendiği saat; RFC 3339 dizesi olarak biçimlendirilmiştir. Tue, 23 Jul 2019 21:10:57 GMT
additionalUserInfo Kullanıcı hakkında bilgi içeren bir nesne. AdditionalUserInfo
credential Kullanıcının kimlik bilgileri hakkında bilgi içeren bir nesne. AuthCredential

Kaydı veya oturum açmayı engelleme

Bir kayıt veya oturum açma girişimini engellemek için işlevinize bir HttpsError atın. Örneğin:

Node.js

throw new functions.auth.HttpsError('permission-denied');

Aşağıdaki tabloda, karşılaşabileceğiniz hatalar, varsayılan hata mesajlarıyla birlikte listelenmektedir:

İsim Kod İleti
invalid-argument 400 Müşteri geçersiz bir bağımsız değişken belirtti.
failed-precondition 400 İstek mevcut sistem durumunda yürütülemiyor.
out-of-range 400 İstemci geçersiz bir aralık belirtti.
unauthenticated 401 Eksik, geçersiz veya süresi dolmuş OAuth jetonu.
permission-denied 403 İstemcinin yeterli izni yok.
not-found 404 Belirtilen kaynak bulunamadı.
aborted 409 Okuma-değiştirme-yazma çakışması gibi eşzamanlılık çakışması.
already-exists 409 Bir istemcinin oluşturmaya çalıştığı kaynak zaten mevcut.
resource-exhausted 429 Kaynak kotası bitti veya oran sınırlamasına ulaşıldı.
cancelled 499 İstek müşteri tarafından iptal edildi.
data-loss 500 Kurtarılamaz veri kaybı veya veri bozulması.
unknown 500 Bilinmeyen sunucu hatası.
internal 500 İç Sunucu Hatası.
not-implemented 501 API yöntemi sunucu tarafından uygulanmadı.
unavailable 503 Hizmet kullanılamıyor.
deadline-exceeded 504 Talep süresi aşıldı.

Ayrıca özel bir hata mesajı da belirleyebilirsiniz:

Node.js

throw new functions.auth.HttpsError('permission-denied', 'Unauthorized request origin!');

Aşağıdaki örnekte, belirli bir alanda bulunmayan kullanıcıların uygulamanıza kaydolmasının nasıl engelleneceği gösterilmektedir:

Node.js

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  // (If the user is authenticating within a tenant context, the tenant ID can be determined from
  // user.tenantId or from context.resource, e.g. 'projects/project-id/tenant/tenant-id-1')

  // Only users of a specific domain can sign up.
  if (user.email.indexOf('@acme.com') === -1) {
    throw new functions.auth.HttpsError('invalid-argument', `Unauthorized email "${user.email}"`);
  }
});

Varsayılan veya özel bir mesaj kullanmanızdan bağımsız olarak Cloud Functions, hatayı sarar ve istemciye dahili bir hata olarak döndürür. Örneğin:

throw new functions.auth.HttpsError('invalid-argument', `Unauthorized email user@evil.com}`);

Uygulamanız hatayı yakalamalı ve buna göre ele almalıdır. Örneğin:

JavaScript

// Blocking functions can also be triggered in a multi-tenant context before user creation.
// firebase.auth().tenantId = 'tenant-id-1';
firebase.auth().createUserWithEmailAndPassword('johndoe@example.com', 'password')
  .then((result) => {
    result.user.getIdTokenResult()
  })
  .then((idTokenResult) => {
    console.log(idTokenResult.claim.admin);
  })
  .catch((error) => {
    if (error.code !== 'auth/internal-error' && error.message.indexOf('Cloud Function') !== -1) {
      // Display error.
    } else {
      // Registration succeeds.
    }
  });

Bir kullanıcıyı değiştirme

Bir kayıt veya oturum açma girişimini engellemek yerine, işlemin devam etmesine izin verebilir, ancak Firebase Authentication'ın veritabanına kaydedilen ve istemciye geri gönderilen User nesnesini değiştirebilirsiniz.

Bir kullanıcıyı değiştirmek için olay işleyicinizden değiştirilecek alanları içeren bir nesne döndürün. Aşağıdaki alanları değiştirebilirsiniz:

  • displayName
  • disabled
  • emailVerified
  • photoUrl
  • customClaims
  • sessionClaims (yalnızca beforeSignIn )

sessionClaims haricinde, değiştirilen tüm alanlar Firebase Authentication'ın veritabanına kaydedilir; bu, bunların yanıt belirtecine dahil edildiği ve kullanıcı oturumları arasında kalıcı olduğu anlamına gelir.

Aşağıdaki örnek, varsayılan bir görünen adın nasıl ayarlanacağını gösterir:

Node.js

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  return {
    // If no display name is provided, set it to "Guest".
    displayName: user.displayName || 'Guest';
  };
});

Hem beforeCreate hem de beforeSignIn için bir olay işleyicisi kaydederseniz, beforeSignIn beforeCreate sonra yürütüldüğünü unutmayın. beforeCreate güncellenen kullanıcı alanları beforeSignIn görünür. Her iki olay işleyicisinde de sessionClaims dışında bir alan ayarlarsanız beforeSignIn içinde ayarlanan değer, beforeCreate içinde ayarlanan değerin üzerine yazar. Yalnızca sessionClaims için bunlar geçerli oturumun belirteç taleplerine yayılır ancak kalıcı olmaz veya veritabanında saklanmaz.

Örneğin, herhangi bir sessionClaims ayarlanmışsa beforeSignIn bunları herhangi bir beforeCreate talebiyle birlikte döndürecek ve birleştirilecektir. Birleştirildiklerinde, bir sessionClaims anahtarı, customClaims içindeki bir anahtarla eşleşirse, sessionClaims anahtarı, belirteç taleplerinde eşleşen customClaims üzerine yazılacaktır. Ancak üzerine yazılan customClaims anahtarı, gelecekteki istekler için veritabanında kalmaya devam edecektir.

Desteklenen OAuth kimlik bilgileri ve verileri

OAuth kimlik bilgilerini ve verilerini çeşitli kimlik sağlayıcıların engelleme işlevlerine iletebilirsiniz. Aşağıdaki tablo, her kimlik sağlayıcı için hangi kimlik bilgilerinin ve verilerin desteklendiğini gösterir:

Kimlik Sağlayıcı Kimlik Jetonu Erişim Jetonu Sona Erme Süresi Jeton Sırrı Jetonu Yenile Oturum Açma Talepleri
Google Evet Evet Evet HAYIR Evet HAYIR
Facebook HAYIR Evet Evet HAYIR HAYIR HAYIR
heyecan HAYIR Evet HAYIR Evet HAYIR HAYIR
GitHub HAYIR Evet HAYIR HAYIR HAYIR HAYIR
Microsoft Evet Evet Evet HAYIR Evet HAYIR
LinkedIn HAYIR Evet Evet HAYIR HAYIR HAYIR
yahoo Evet Evet Evet HAYIR Evet HAYIR
Elma Evet Evet Evet HAYIR Evet HAYIR
SAML HAYIR HAYIR HAYIR HAYIR HAYIR Evet
OIDC Evet Evet Evet HAYIR Evet Evet

Belirteçleri yenile

Bir engelleme işlevinde yenileme belirteci kullanmak için öncelikle Firebase konsolunun Engelleme işlevleri sayfasındaki onay kutusunu seçmeniz gerekir.

Kimlik belirteci veya erişim belirteci gibi bir OAuth kimlik bilgisiyle doğrudan oturum açtığınızda, herhangi bir kimlik sağlayıcı tarafından yenileme belirteçleri iade edilmeyecektir. Bu durumda, aynı istemci tarafı OAuth kimlik bilgisi engelleme işlevine iletilecektir.

Aşağıdaki bölümlerde her kimlik sağlayıcı türü ve bunların desteklenen kimlik bilgileri ve verileri açıklanmaktadır.

Genel OIDC sağlayıcıları

Bir kullanıcı genel bir OIDC sağlayıcısıyla oturum açtığında aşağıdaki kimlik bilgileri aktarılır:

  • Kimlik belirteci : id_token akışı seçilirse sağlanır.
  • Erişim belirteci : Kod akışı seçilirse sağlanır. Kod akışının şu anda yalnızca REST API aracılığıyla desteklendiğini unutmayın.
  • Belirteci yenile : offline_access kapsamı seçilirse sağlanır.

Örnek:

const provider = new firebase.auth.OAuthProvider('oidc.my-provider');
provider.addScope('offline_access');
firebase.auth().signInWithPopup(provider);

Google

Bir kullanıcı Google'da oturum açtığında aşağıdaki kimlik bilgileri iletilecektir:

  • Kimlik jetonu
  • Erişim jetonu
  • Jetonu yenile : Yalnızca aşağıdaki özel parametreler talep edilirse sağlanır:
    • access_type=offline
    • prompt=consent , kullanıcı daha önce izin verdiyse ve yeni kapsam istenmediyse

Örnek:

const provider = new firebase.auth.GoogleAuthProvider();
provider.setCustomParameters({
  'access_type': 'offline',
  'prompt': 'consent'
});
firebase.auth().signInWithPopup(provider);

Google yenileme jetonları hakkında daha fazla bilgi edinin.

Facebook

Bir kullanıcı Facebook'ta oturum açtığında aşağıdaki kimlik bilgileri iletilecektir:

  • Erişim belirteci : Başka bir erişim belirteciyle değiştirilebilecek bir erişim belirteci döndürülür. Facebook tarafından desteklenen farklı erişim jeton türleri ve bunları uzun ömürlü jetonlarla nasıl değiştirebileceğiniz hakkında daha fazla bilgi edinin.

GitHub

Bir kullanıcı GitHub'da oturum açtığında aşağıdaki kimlik bilgileri iletilecektir:

  • Erişim belirteci : İptal edilmedikçe süresi dolmaz.

Microsoft

Bir kullanıcı Microsoft'ta oturum açtığında aşağıdaki kimlik bilgileri iletilecektir:

Örnek:

const provider = new firebase.auth.OAuthProvider('microsoft.com');
provider.addScope('offline_access');
firebase.auth().signInWithPopup(provider);

yahoo

Bir kullanıcı Yahoo'da oturum açtığında aşağıdaki kimlik bilgileri herhangi bir özel parametre veya kapsam olmadan iletilecektir:

  • Kimlik jetonu
  • Erişim jetonu
  • Jetonu yenile

LinkedIn

Bir kullanıcı LinkedIn'de oturum açtığında aşağıdaki kimlik bilgileri iletilecektir:

  • Erişim jetonu

Elma

Bir kullanıcı Apple ile oturum açtığında aşağıdaki kimlik bilgileri herhangi bir özel parametre veya kapsam olmadan iletilecektir:

  • Kimlik jetonu
  • Erişim jetonu
  • Jetonu yenile

Ortak senaryolar

Aşağıdaki örneklerde engelleme işlevlerine ilişkin bazı yaygın kullanım durumları gösterilmektedir:

Yalnızca belirli bir alan adından kayıt yapılmasına izin veriliyor

Aşağıdaki örnek, example.com alanının parçası olmayan kullanıcıların uygulamanıza kaydolmasının nasıl önleneceğini gösterir:

Node.js

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (!user.email || user.email.indexOf('@example.com') === -1) {
    throw new functions.auth.HttpsError(
      'invalid-argument', `Unauthorized email "${user.email}"`);
  }
});

Doğrulanmamış e-postalara sahip kullanıcıların kaydolmasını engelleme

Aşağıdaki örnek, doğrulanmamış e-postalara sahip kullanıcıların uygulamanıza kaydolmasının nasıl önleneceğini gösterir:

Node.js

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (user.email && !user.emailVerified) {
    throw new functions.auth.HttpsError(
      'invalid-argument', `Unverified email "${user.email}"`);
  }
});

Kayıt sırasında e-posta doğrulamasını zorunlu kılma

Aşağıdaki örnek, kayıt olduktan sonra bir kullanıcının e-postasını doğrulamasının nasıl gerekli kılınacağını gösterir:

Node.js

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  const locale = context.locale;
  if (user.email && !user.emailVerified) {
    // Send custom email verification on sign-up.
    return admin.auth().generateEmailVerificationLink(user.email).then((link) => {
      return sendCustomVerificationEmail(user.email, link, locale);
    });
  }
});

exports.beforeSignIn = functions.auth.user().beforeSignIn((user, context) => {
 if (user.email && !user.emailVerified) {
   throw new functions.auth.HttpsError(
     'invalid-argument', `"${user.email}" needs to be verified before access is granted.`);
  }
});

Belirli kimlik sağlayıcı e-postalarının doğrulanmış olarak değerlendirilmesi

Aşağıdaki örnek, belirli kimlik sağlayıcılardan gelen kullanıcı e-postalarının doğrulanmış olarak nasıl değerlendirileceğini gösterir:

Node.js

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (user.email && !user.emailVerified && context.eventType.indexOf(':facebook.com') !== -1) {
    return {
      emailVerified: true,
    };
  }
});

Belirli IP adreslerinden oturum açmanın engellenmesi

Aşağıdaki örnek, belirli IP adresi aralıklarından oturum açmanın nasıl engellendiğini gösterir:

Node.js

exports.beforeSignIn = functions.auth.user().beforeSignIn((user, context) => {
  if (isSuspiciousIpAddress(context.ipAddress)) {
    throw new functions.auth.HttpsError(
      'permission-denied', 'Unauthorized access!');
  }
});

Özel ve oturum taleplerini ayarlama

Aşağıdaki örnek, özel taleplerin ve oturum taleplerinin nasıl ayarlanacağını gösterir:

Node.js

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (context.credential &&
      context.credential.providerId === 'saml.my-provider-id') {
    return {
      // Employee ID does not change so save in persistent claims (stored in
      // Auth DB).
      customClaims: {
        eid: context.credential.claims.employeeid,
      },
      // Copy role and groups to token claims. These will not be persisted.
      sessionClaims: {
        role: context.credential.claims.role,
        groups: context.credential.claims.groups,
      }
    }
  }
});

Şüpheli etkinliği izlemek için IP adreslerini izleme

Bir kullanıcının oturum açtığı IP adresini takip ederek ve bunu sonraki isteklerde IP adresiyle karşılaştırarak jeton hırsızlığını önleyebilirsiniz. İstek şüpheli görünüyorsa (örneğin, IP'ler farklı coğrafi bölgelerden geliyorsa) kullanıcıdan tekrar oturum açmasını isteyebilirsiniz.

  1. Kullanıcının oturum açtığı IP adresini izlemek için oturum taleplerini kullanın:

    Node.js

    exports.beforeSignIn = functions.auth.user().beforeSignIn((user, context) => {
      return {
        sessionClaims: {
          signInIpAddress: context.ipAddress,
        },
      };
    });
    
  2. Bir kullanıcı, Firebase Authentication ile kimlik doğrulaması gerektiren kaynaklara erişmeye çalıştığında, istekteki IP adresini oturum açmak için kullanılan IP ile karşılaştırın:

    Node.js

    app.post('/getRestrictedData', (req, res) => {
      // Get the ID token passed.
      const idToken = req.body.idToken;
      // Verify the ID token, check if revoked and decode its payload.
      admin.auth().verifyIdToken(idToken, true).then((claims) => {
        // Get request IP address
        const requestIpAddress = req.connection.remoteAddress;
        // Get sign-in IP address.
        const signInIpAddress = claims.signInIpAddress;
        // Check if the request IP address origin is suspicious relative to
        // the session IP addresses. The current request timestamp and the
        // auth_time of the ID token can provide additional signals of abuse,
        // especially if the IP address suddenly changed. If there was a sudden
        // geographical change in a short period of time, then it will give
        // stronger signals of possible abuse.
        if (!isSuspiciousIpAddressChange(signInIpAddress, requestIpAddress)) {
          // Suspicious IP address change. Require re-authentication.
          // You can also revoke all user sessions by calling:
          // admin.auth().revokeRefreshTokens(claims.sub).
          res.status(401).send({error: 'Unauthorized access. Please login again!'});
        } else {
          // Access is valid. Try to return data.
          getData(claims).then(data => {
            res.end(JSON.stringify(data);
          }, error => {
            res.status(500).send({ error: 'Server error!' })
          });
        }
      });
    });
    

Kullanıcı fotoğrafları taranıyor

Aşağıdaki örnek, kullanıcıların profil fotoğraflarının nasıl sterilize edileceğini gösterir:

Node.js

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (user.photoURL) {
    return isPhotoAppropriate(user.photoURL)
      .then((status) => {
        if (!status) {
          // Sanitize inappropriate photos by replacing them with guest photos.
          // Users could also be blocked from sign-up, disabled, etc.
          return {
            photoUrl: PLACEHOLDER_GUEST_PHOTO_URL,
          };
        }
      });
});

Görüntülerin nasıl algılanacağı ve temizleneceği hakkında daha fazla bilgi edinmek için Cloud Vision belgelerine bakın.

Kullanıcının kimlik sağlayıcısı OAuth kimlik bilgilerine erişme

Aşağıdaki örnek, Google ile oturum açan bir kullanıcı için yenileme jetonunun nasıl alınacağını ve bunu Google Takvim API'lerini çağırmak için nasıl kullanacağınızı gösterir. Yenileme jetonu çevrimdışı erişim için saklanır.

Node.js

const {OAuth2Client} = require('google-auth-library');
const {google} = require('googleapis');
// ...
// Initialize Google OAuth client.
const keys = require('./oauth2.keys.json');
const oAuth2Client = new OAuth2Client(
  keys.web.client_id,
  keys.web.client_secret
);

exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
  if (context.credential &&
      context.credential.providerId === 'google.com') {
    // Store the refresh token for later offline use.
    // These will only be returned if refresh tokens credentials are included
    // (enabled by Cloud console).
    return saveUserRefreshToken(
        user.uid,
        context.credential.refreshToken,
        'google.com'
      )
      .then(() => {
        // Blocking the function is not required. The function can resolve while
        // this operation continues to run in the background.
        return new Promise((resolve, reject) => {
          // For this operation to succeed, the appropriate OAuth scope should be requested
          // on sign in with Google, client-side. In this case:
          // https://www.googleapis.com/auth/calendar
          // You can check granted_scopes from within:
          // context.additionalUserInfo.profile.granted_scopes (space joined list of scopes).

          // Set access token/refresh token.
          oAuth2Client.setCredentials({
            access_token: context.credential.accessToken,
            refresh_token: context.credential.refreshToken,
          });
          const calendar = google.calendar('v3');
          // Setup Onboarding event on user's calendar.
          const event = {/** ... */};
          calendar.events.insert({
            auth: oauth2client,
            calendarId: 'primary',
            resource: event,
          }, (err, event) => {
            // Do not fail. This is a best effort approach.
            resolve();
          });
      });
    })
  }
});

Kullanıcı işlemi için reCAPTCHA Enterprise kararını geçersiz kıl

Aşağıdaki örnek, desteklenen kullanıcı akışları için reCAPTCHA Enterprise kararının nasıl geçersiz kılınacağını gösterir.

reCAPTCHA Enterprise'ı Firebase Authentication ile entegre etme hakkında daha fazla bilgi edinmek için reCAPTCHA Enterprise'ı Etkinleştirme konusuna bakın.

Engelleme işlevleri, özel faktörlere dayalı olarak akışlara izin vermek veya akışları engellemek için kullanılabilir, böylece reCAPTCHA Enterprise tarafından sağlanan sonuç geçersiz kılınır.

Node.js

 const {
   auth,
 } = require("firebase-functions/v1");

exports.checkrecaptchaV1 = auth.user().beforeSignIn((userRecord, context) => {
 // Allow users with a specific email domain to sign in regardless of their recaptcha score.
 if (userRecord.email && userRecord.email.indexOf('@acme.com') === -1) {
   return {
     recaptchaActionOverride: 'ALLOW',
   };
 }

 // Allow users to sign in with recaptcha score greater than 0.5
 if (context.additionalUserInfo.recaptchaScore > 0.5) {
   return {
     recaptchaActionOverride: 'ALLOW',
   };
 }

 // Block all others.
 return {
   recaptchaActionOverride: 'BLOCK',
 };
});