Kimlik doğrulama engelleme tetikleyicileri


Engelleme işlevleri, bir kullanıcının uygulamanıza kaydolup kaydolamayacağını veya uygulamanızda oturum açıp açmayacağını belirleyen özel bir kodu yürütmenize olanak tanır. Örneğin, belirli ölçütleri karşılamayan bir kullanıcının kimliğini doğrulamasını engelleyebilir veya kullanıcının bilgilerini istemci uygulamanıza döndürmeden önce güncelleyebilirsiniz.

Başlamadan önce

Engelleme işlevlerini kullanmak için Firebase projenizi Firebase Authentication with Identity Platform sürümüne yükseltmeniz gerekir. Henüz yükseltme yapmadıysanız önce yükseltme yapın.

Engelleme işlevlerini anlama

Aşağıdaki etkinlikler için engelleme işlevlerini kaydedebilirsiniz:

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

  • beforeSignIn: Kullanıcının kimlik bilgileri doğrulandıktan sonra ancak Firebase Authentication, istemci uygulamanıza bir kimlik jetonu döndürmeden önce tetiklenir. Uygulamanızda çok öğeli kimlik doğrulama kullanılıyorsa işlev, kullanıcı ikinci öğesini doğruladıktan sonra tetiklenir. Yeni bir kullanıcı oluşturmanın beforeCreate'ye ek olarak beforeSignIn'yı da tetiklediğini unutmayın.

  • beforeEmail (yalnızca Node.js): Bir kullanıcıya e-posta (örneğin,
    oturum açma veya şifre sıfırlama e-postası) gönderilmeden önce tetiklenir.

  • beforeSms (yalnızca Node.js): Çok faktörlü kimlik doğrulama gibi durumlarda kullanıcıya SMS mesajı gönderilmeden önce tetiklenir.

Engelleme işlevlerini kullanırken aşağıdakileri göz önünde bulundurun:

  • İşleviniz 7 saniye içinde yanıt vermelidir. 7 saniye sonra Firebase Authentication 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 iletilir. İstemci kodunuzun, işlevinizin döndürebileceği tüm hataları işlediğinden emin olun.

  • İşlevler, kiracı içinde bulunanlar da dahil olmak üzere projenizdeki tüm kullanıcılar için geçerlidir. Firebase Authentication, kullanıcılar hakkında işlevinize bilgi sağlar. Bu bilgiler, kullanıcıların ait olduğu kiracıları da içerir. Böylece buna göre yanıt verebilirsiniz.

  • Başka bir kimlik sağlayıcıyı hesaba bağlamak, kayıtlı tüm 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ğrulama ve kullanıcı oluşturma işlemlerinin başarılı olması için özel kodunuzun başarıyla tamamlanması gerekir.

Engelleme işlevini, diğer işlevleri dağıttığınız şekilde dağıtırsınız. (Ayrıntılar için Cloud Functions Başlangıç sayfasına bakın). Özet olarak:

  1. Hedeflenen etkinliği işleyen bir işlev yazın.

    Örneğin, başlamak için index.js'ya aşağıdaki gibi bir no-op işlevi ekleyebilirsiniz:

    const functions = require('firebase-functions/v1');
    
    exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
      // TODO
    });
    
    The above example has omitted the implementation of custom auth logic. See
    the following sections to learn how to implement your blocking functions and
    [Common scenarios](#common-scenarios) for specific examples.
    
  1. Firebase CLI'yı 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 etkinlikleri, oturum açan kullanıcıyla ilgili bilgileri içeren User ve EventContext nesneleri sağlar. Bir işlemin devam etmesine izin verilip verilmeyeceğini belirlemek için kodunuzda bu değerleri kullanın.

User nesnesinde kullanılabilen özelliklerin listesi için UserRecord API referansına bakın.

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

Ad Açıklama Örnek
locale Uygulama yerel ayarı. Yerel ayarı istemci SDK'sını kullanarak veya REST API'de yerel ayar üstbilgisini 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, etkinlik adı (ör. beforeSignIn veya beforeCreate) ve kullanılan ilişkili oturum açma yöntemi (ör. Google veya e-posta/şifre) 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 zaman, RFC 3339 dizesi olarak biçimlendirilir. 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 bilgisiyle ilgili bilgileri içeren bir nesne. AuthCredential

Kayıt veya oturum açma işlemlerini engelleme

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

Node.js

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

Aşağıdaki tabloda, oluşturabileceğiniz hatalar ve varsayılan hata mesajları listelenmiştir:

Ad Kod Mesaj
invalid-argument 400 İstemci, geçersiz bağımsız değişken belirtti.
failed-precondition 400 Mevcut sistem durumunda istek yürütülemiyor.
out-of-range 400 İstemci, geçersiz aralık belirtti.
unauthenticated 401 Eksik, geçersiz veya süresi dolmuş OAuth jetonu.
permission-denied 403 İstemci, gerekli izne sahip değil.
not-found 404 Belirtilen kaynak bulunamadı.
aborted 409 Eşzamanlılık uyuşmazlığı (ör. okuma-değiştirme-yazma uyuşmazlığı).
already-exists 409 Bir istemcinin oluşturmaya çalıştığı kaynak zaten mevcut.
resource-exhausted 429 Kaynak kotası kalmadı veya hız sınırlamasına yaklaşılıyor.
cancelled 499 İstek, istemci tarafından iptal edildi.
data-loss 500 Kurtarılamaz veri kaybı veya veri bozulması.
unknown 500 Bilinmeyen sunucu hatası.
internal 500 Dahili sunucu hatası.
not-implemented 501 API yöntemi, sunucu tarafından uygulanmadı.
unavailable 503 Hizmet kullanılamıyor.
deadline-exceeded 504 İstek bitiş tarihi aşıldı.

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

Node.js

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

Aşağıdaki örnekte, belirli bir alanın dışında kalan kullanıcıların uygulamanıza kaydolmasını nasıl engelleyeceğiniz 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 kullanıp kullanmadığınızdan bağımsız olarak, Cloud Functions hatayı sarmalar ve istemciye dahili 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 işlem yapmalı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.
    }
  });

Kullanıcıyı değiştirme

Kayıt veya oturum açma girişimini engellemek yerine işlemin devam etmesine izin verebilirsiniz ancak User nesnesini değiştirerek Firebase Authentication'nin veritabanına kaydedebilir ve istemciye döndürebilirsiniz.

Bir kullanıcıyı değiştirmek için etkinlik 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 hariç tüm değiştirilen alanlar Firebase Authentication'nin veritabanına kaydedilir. Bu nedenle, yanıt jetonuna dahil edilirler ve kullanıcı oturumları arasında kalıcı olurlar.

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

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 etkinlik işleyici kaydederseniz beforeSignIn'nin beforeCreate'dan sonra yürütüleceğini unutmayın. beforeCreate içinde güncellenen kullanıcı alanları beforeSignIn içinde görünür. Her iki etkinlik işleyicide de sessionClaims dışında bir alan ayarlarsanız beforeSignIn içinde ayarlanan değer, beforeCreate içinde ayarlanan değerin üzerine yazılır. Yalnızca sessionClaims için geçerli olan bu bilgiler, mevcut oturumun jeton taleplerine yayılır ancak veritabanında kalıcı hale getirilmez veya depolanmaz.

Örneğin, herhangi bir sessionClaims ayarlanmışsa beforeSignIn, bunları beforeCreate talepleriyle birlikte döndürür ve bunlar birleştirilir. Birleştirildiklerinde, sessionClaims anahtarı customClaims içindeki bir anahtarla eşleşirse eşleşen customClaims, jeton taleplerinde sessionClaims anahtarıyla üzerine yazılır. Ancak, üzerine yazılan customClaims anahtarı, gelecekteki istekler için veritabanında kalmaya devam eder.

Desteklenen OAuth kimlik bilgileri ve verileri

Çeşitli kimlik sağlayıcılarından gelen OAuth kimlik bilgilerini ve verilerini engelleme işlevlerine iletebilirsiniz. Aşağıdaki tabloda, her kimlik sağlayıcı için hangi kimlik bilgilerinin ve verilerin desteklendiği gösterilmektedir:

Kimlik Sağlayıcı Kimlik jetonu Erişim Jetonu Son Kullanma Tarihi Jeton Gizli Anahtarı Yenileme Jetonu Oturum açma hak talepleri
Google Evet Evet Evet Hayır Evet Hayır
Facebook Hayır Evet Evet Hayır Hayır Hayır
Twitter Hayır Evet Hayır Evet Hayır Hayır
GitHub Hayır Evet Hayır Hayır Hayır Hayır
Microsoft Evet Evet Evet Hayır Evet Hayır
LinkedIn Hayır Evet Evet Hayır Hayır Hayır
Yahoo Evet Evet Evet Hayır Evet Hayır
Apple Evet Evet Evet Hayır Evet Hayır
SAML Hayır Hayır Hayır Hayır Hayır Evet
OIDC Evet Evet Evet Hayır Evet Evet

Yenileme jetonları

Yenileme jetonunu engelleyici bir işlevde kullanmak için öncelikle Firebase konsolunun Engelleyici işlevler sayfasındaki onay kutusunu işaretlemeniz gerekir.

Doğrudan bir OAuth kimlik bilgisiyle (ör. kimlik jetonu veya erişim jetonu) oturum açarken yenileme jetonları hiçbir kimlik sağlayıcı tarafından döndürülmez. Bu durumda, aynı istemci tarafı OAuth kimlik bilgisi engelleme işlevine iletilir.

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

Genel OIDC sağlayıcıları

Kullanıcı genel bir OIDC sağlayıcısıyla oturum açtığında aşağıdaki kimlik bilgileri iletilir:

  • Kimlik jetonu: id_token akışı seçilirse sağlanır.
  • Erişim jetonu: Kod akışı seçilirse sağlanır. Kod akışının şu anda yalnızca REST API üzerinden desteklendiğini unutmayın.
  • Yenileme jetonu: offline_access kapsamı seçiliyse sağlanır.

Örnek:

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

Google

Kullanıcı Google ile oturum açtığında aşağıdaki kimlik bilgileri iletilir:

  • ID jetonu
  • Erişim jetonu
  • Yenileme jetonu: Yalnızca aşağıdaki özel parametreler istenirse 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

Kullanıcı Facebook ile oturum açtığında aşağıdaki kimlik bilgisi iletilir:

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

GitHub

Kullanıcı GitHub ile oturum açtığında aşağıdaki kimlik bilgisi iletilir:

  • Erişim jetonu: İptal edilmediği sürece süresi dolmaz.

Microsoft

Kullanıcı Microsoft ile oturum açtığında aşağıdaki kimlik bilgileri iletilir:

Örnek:

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

Yahoo

Bir kullanıcı Yahoo ile oturum açtığında, aşağıdaki kimlik bilgileri özel parametreler veya kapsamlar olmadan iletilir:

  • ID jetonu
  • Erişim jetonu
  • Yenileme jetonu

LinkedIn

Bir kullanıcı LinkedIn ile oturum açtığında aşağıdaki kimlik bilgisi iletilir:

  • Erişim jetonu

Apple

Bir kullanıcı Apple ile oturum açtığında aşağıdaki kimlik bilgileri özel parametreler veya kapsamlar olmadan iletilir:

  • ID jetonu
  • Erişim jetonu
  • Yenileme jetonu

Sık karşılaşılan senaryolar

Aşağıdaki örneklerde, engelleme işlevlerinin yaygın kullanım alanlarından bazıları gösterilmektedir:

Yalnızca belirli bir alandan kayda izin verme

Aşağıdaki örnekte, example.com alanının parçası olmayan kullanıcıların uygulamanıza kaydolmasını nasıl önleyeceğiniz gösterilmektedir:

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-posta adresleri olan kullanıcıların kaydolmasını engelleme

Aşağıdaki örnekte, doğrulanmamış e-posta adreslerine sahip kullanıcıların uygulamanıza kaydolmasını nasıl engelleyeceğiniz gösterilmektedir:

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ı gerektirme

Aşağıdaki örnekte, bir kullanıcının kaydolduktan sonra e-postasını doğrulamasını nasıl zorunlu kılacağınız gösterilmektedir:

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ı doğrulanmış olarak kabul etme

Aşağıdaki örnekte, belirli kimlik sağlayıcılarından gelen kullanıcı e-postalarının nasıl doğrulanmış olarak ele alınacağı gösterilmektedir:

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çmayı engelleme

Aşağıdaki örnekte, belirli IP adresi aralıklarından oturum açmanın nasıl engelleneceği gösterilmektedir:

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 örnekte, özel ve oturum taleplerinin nasıl ayarlanacağı gösterilmektedir:

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 takip etme

Kullanıcının oturum açtığı IP adresini izleyip sonraki isteklerdeki IP adresiyle karşılaştırarak jeton hırsızlığını önleyebilirsiniz. İstek şüpheli görünüyorsa (ör. 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ğrulama 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ını inceleme

Aşağıdaki örnekte, kullanıcıların profil fotoğraflarının nasıl temizleneceği gösterilmektedir:

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üleri algılama ve temizleme 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 örnekte, Google ile oturum açan bir kullanıcı için yenileme jetonunun nasıl alınacağı ve Google Takvim API'lerini çağırmak için nasıl kullanılacağı gösterilmektedir. 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ılma

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

reCAPTCHA Enterprise'ı Firebase Authentication ile entegre etme hakkında daha fazla bilgi edinmek için reCAPTCHA Enterprise'ı etkinleştirme başlıklı makaleyi inceleyin.

Engelleme işlevleri, akışlara özel faktörlere göre 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 functions = require("firebase-functions/v1");
exports.beforesmsv1 = functions.auth.user().beforeSms((context) => {
 if (
   context.smsType === "SIGN_IN_OR_SIGN_UP" &&
   context.additionalUserInfo.phoneNumber.includes('+91')
 ) {
   return {
     recaptchaActionOverride: "ALLOW",
   };
 }

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

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