Data Connect için Common Expression Language söz dizimi referansı

Bu referans kılavuzunda, @auth(expr:) ve @check(expr:) yönergeleri için ifade oluşturmayla ilgili Common Expression Language (CEL) söz dizimi ele alınmaktadır.

CEL ile ilgili tam referans bilgileri CEL spesifikasyonunda sağlanır.

Sorgulara ve mutasyonlara iletilen test değişkenleri

@auth(expr) söz dizimi, sorgulardan ve mutasyonlardan değişkenlere erişmenize ve bunları test etmenize olanak tanır.

Örneğin, vars.status kullanarak $status gibi bir işlem değişkeni ekleyebilirsiniz.

mutation Update($id: UUID!, $status: Any) @auth(expr: "has(vars.status)")

İfadeler tarafından kullanılabilen veriler

Hem @auth(expr:) hem de @check(expr:) CEL ifadeleri aşağıdakileri değerlendirebilir:

  • request.operationName
  • vars (request.variables için takma ad)
  • auth (request.auth için takma ad)

Ayrıca @check(expr:) ifadeleri şunları değerlendirebilir:

  • this (mevcut alanın değeri)

request.operationName nesnesi

request.operarationName nesnesi, sorgulama veya mutasyon olmak üzere işlemin türünü depolar.

vars nesnesi

vars nesnesi, ifadelerinizin sorgunuzda veya mutasyonunuzda iletilen tüm değişkenlere erişmesine olanak tanır.

Tam nitelikli request.variables.<variablename> için bir ifadede vars.<variablename> takma adını kullanabilirsiniz:

# The following are equivalent
mutation StringType($v: String!) @auth(expr: "vars.v == 'hello'")
mutation StringType($v: String!) @auth(expr: "request.variables.v == 'hello'")

auth nesnesi

Authentication, verilerinize erişim isteyen kullanıcıları tanımlar ve bu bilgileri ifadelerinizde kullanabileceğiniz bir nesne olarak sağlar.

Filtrelerinizde ve ifadenizde request.auth için takma ad olarak auth kullanabilirsiniz.

Kimlik doğrulama nesnesi aşağıdaki bilgileri içerir:

  • uid: İstekte bulunan kullanıcıya atanan benzersiz bir kullanıcı kimliği.
  • token: Authentication tarafından toplanan değerlerin haritası.

auth.token içeriği hakkında daha fazla bilgi için Kimlik doğrulama jetonlarındaki veriler başlıklı makaleyi inceleyin.

this bağlaması

Bağlama this, @check yönergesinin bağlı olduğu alanı değerlendirir. Temel bir durumda, tek değerli sorgu sonuçlarını değerlendirebilirsiniz.

mutation UpdateMovieTitle($movieId: UUID!, $newTitle: String!) @auth(level: USER) @transaction {
  # Step 1: Query and check
  query @redact {
    moviePermission( # Look up a join table called MoviePermission with a compound key.
      key: {movieId: $movieId, userId_expr: "auth.uid"}
    ) {
      # Check if the user has the editor role for the movie. `this` is the string value of `role`.
      # If the parent moviePermission is null, the @check will also fail automatically.
      role @check(expr: "this == 'editor'", message: "You must be an editor of this movie to update title")
    }
  }
  # Step 2: Act
  movie_update(id: $movieId, data: {
    title: $newTitle
  })
}

Döndürülen alan, herhangi bir üst öğe liste olduğu için birden çok kez oluşuyorsa her bir oluşum, her değere bağlı this ile test edilir.

Belirli bir yol için bir üst öğe null veya [] ise alana ulaşılamaz ve CEL değerlendirmesi bu yol için atlanır. Diğer bir deyişle, değerlendirme yalnızca this null veya null olmayan bir değer olduğunda gerçekleşir ancak hiçbir zaman undefined olduğunda gerçekleşmez.

Alanın kendisi bir liste veya nesne olduğunda this, aşağıdaki örnekte gösterildiği gibi aynı yapıyı (nesneler söz konusu olduğunda seçilen tüm alt öğeler dahil) izler.

mutation UpdateMovieTitle2($movieId: UUID!, $newTitle: String!) @auth(level: USER) @transaction {
  # Step 1: Query and check
  query {
    moviePermissions( # Now we query for a list of all matching MoviePermissions.
      where: {movieId: {eq: $movieId}, userId: {eq_expr: "auth.uid"}}
    # This time we execute the @check on the list, so `this` is the list of objects.
    # We can use the `.exists` macro to check if there is at least one matching entry.
    ) @check(expr: "this.exists(p, p.role == 'editor')", message: "You must be an editor of this movie to update title") {
      role
    }
  }
  # Step 2: Act
  movie_update(id: $movieId, data: {
    title: $newTitle
  })
}

Karmaşık ifade söz dizimi

&& ve || operatörlerini kullanarak daha karmaşık ifadeler yazabilirsiniz.

mutation UpsertUser($username: String!) @auth(expr: "(auth != null) && (vars.username == 'joe')")

Aşağıdaki bölümde, kullanılabilen tüm operatörler açıklanmaktadır.

Operatörler ve operatör önceliği

Operatörler ve bunların öncelik sıraları için referans olarak aşağıdaki tabloyu kullanın.

a ve b ifadesi, f alanı ve i dizini verildiğinde.

Operatör Açıklama Birleştirici
a[i] a() a.f Dizin, çağrı, alan erişimi soldan sağa
!a -a Birli olumsuzlama sağdan sola
a/b a%b a*b Çarpım operatörleri soldan sağa
a+b a-b Toplama operatörleri soldan sağa
a>b a>=b a<b a<=b İlişkisel operatörler soldan sağa
a in b Listede veya haritada varlık soldan sağa
type(a) == t Tür karşılaştırması. t bool, int, float, sayı, dize, liste, eşleme, zaman damgası veya süre olabilir. soldan sağa
a==b a!=b Karşılaştırma operatörleri soldan sağa
a && b Koşullu VE soldan sağa
a || b Koşullu VEYA soldan sağa
a ? true_value : false_value Üçlü ifade soldan sağa

Yetkilendirme jetonlarındaki veriler

auth.token nesnesi aşağıdaki değerleri içerebilir:

Alan Açıklama
email Varsa hesapla ilişkili e-posta adresi.
email_verified Kullanıcı email adresine erişimi olduğunu doğruladıysa true. Bazı sağlayıcılar sahip oldukları e-posta adreslerini otomatik olarak doğrular.
phone_number Hesapla ilişkili telefon numarası (varsa).
name Ayarlanmışsa kullanıcının görünen adı.
sub Kullanıcının Firebase UID'si. Bu, proje içinde benzersizdir.
firebase.identities Bu kullanıcının hesabıyla ilişkili tüm kimliklerin sözlüğü. Sözlüğün anahtarları şunlar olabilir: email, phone, google.com, facebook.com, github.com, twitter.com. Sözlüğün değerleri, hesapla ilişkili her kimlik sağlayıcı için benzersiz tanımlayıcı dizileridir. Örneğin, auth.token.firebase.identities["google.com"][0], hesapla ilişkili ilk Google kullanıcı kimliğini içerir.
firebase.sign_in_provider Bu jetonu almak için kullanılan oturum açma sağlayıcısı. Aşağıdaki dizelerden biri olabilir: custom, password, phone, anonymous, google.com, facebook.com, github.com, twitter.com.
firebase.tenant Varsa hesapla ilişkili tenantId. Örneğin, tenant2-m6tyz

JWT kimlik jetonlarındaki ek alanlar

Aşağıdaki auth.token alanlarına da erişebilirsiniz:

Özel jeton talepleri
alg Algoritma "RS256"
iss Düzenleyen Projenizin hizmet hesabı e-posta adresi
sub Konu Projenizin hizmet hesabı e-posta adresi
aud Kitle "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit"
iat Yayınlanma zamanı UNIX sıfır zamanından itibaren saniye cinsinden geçerli zaman
exp Geçerlilik süresi UNIX sıfır zamanından itibaren saniye cinsinden jetonun geçerlilik süresinin sona erdiği zaman. iat'den en fazla 3.600 saniye sonra olabilir.
Not: Bu ayar yalnızca özel jetonun süresinin sona erdiği zamanı kontrol eder. Ancak signInWithCustomToken() kullanarak bir kullanıcının oturumunu açtıktan sonra, oturumu geçersiz kılınana veya kullanıcı oturumu kapatana kadar cihazda oturumu açık kalır.
<claims> (isteğe bağlı) Jetona dahil edilecek isteğe bağlı özel hak talepleri. Bu hak taleplerine ifadelerde auth.token (veya request.auth.token) aracılığıyla erişilebilir. Örneğin, adminClaim özel hak talebi oluşturursanız bu hakka auth.token.adminClaim ile erişebilirsiniz.