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)")
İfadelerin kullanabileceği veriler: request, response, this
Verileri şu amaçlarla kullanırsınız:
@auth(expr:)
ve@check(expr:)
yönergelerinde CEL ifadeleriyle değerlendirme- Sunucu ifadeleri kullanılarak atama,
<field>_expr
.
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)
Mutasyonlarda aşağıdakilerin içeriklerine erişebilir ve bunları atayabilirsiniz:
response
(çok adımlı mantıkta kısmi sonuçları kontrol etmek için)
Ayrıca @check(expr:)
ifadeleri şunları değerlendirebilir:
this
(mevcut alanın değeri)response
(çok adımlı mantıkta kısmi sonuçları kontrol etmek için)
request.operationName bağlaması
request.operarationName
bağlaması, sorguyu veya mutasyonu içeren işlem türünü depolar.
vars
bağlaması (request.vars)
vars
bağlaması, 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 olarak 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
bağlaması (request.auth)
Authentication, verilerinize erişim isteyen kullanıcıları tanımlar ve bu bilgileri ifadelerinizde kullanabileceğiniz bir bağlama olarak sağlar.
Filtrelerinizde ve ifadenizde request.auth
için takma ad olarak auth
kullanabilirsiniz.
Kimlik doğrulama bağlaması 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.
response
bağlaması
response
bağlaması, bir sorguya veya mutasyona yanıt olarak sunucu tarafından toplanan verileri toplandığı sırada içerir.
İşlem ilerledikçe ve her adım başarıyla tamamlandıkça response
, başarıyla tamamlanan adımlardan gelen yanıt verilerini içerir.
response
bağlaması, (birden fazla) iç içe yerleştirilmiş alanlar ve (varsa) yerleşik sorgular dahil olmak üzere ilişkili işlemin şekline göre yapılandırılır.
Yerleşik sorgu yanıt verilerine eriştiğinizde, alanların yerleşik sorguda istenen verilere bağlı olarak herhangi bir veri türü içerebileceğini unutmayın. _insert
ve _delete
gibi mutasyon alanları tarafından döndürülen verilere eriştiğinizde, UUID anahtarları, silme sayısı ve boş değerler içerebilirler (mutasyon referansı bölümüne bakın).
Örneğin:
- Yerleşik sorgu içeren bir mutasyonda
response
bağlama,response.query.<fieldName>.<fieldName>....
'deki arama verilerini (bu durumdaresponse.query.todoList
veresponse.query.todoList.priority
) içerir.
mutation CheckTodoPriority(
$uniqueListName: String!
) {
# This query is identified as `response.query`
query @check(expr: "response.query.todoList.priority == 'high'", message: "This list is not for high priority items!") {
# This field is identified as `response.query.todoList`
todoList(where: { name: $uniqueListName }) {
# This field is identified as `response.query.todoList.priority`
priority
}
}
}
- Birden fazla
_insert
alanının bulunduğu çok adımlı bir mutasyondaresponse
bağlaması,response.<fieldName>.<fieldName>....
alanındaki (bu durumdaresponse.todoList_insert.id
) kısmi verileri içerir.
mutation CreateTodoListWithFirstItem(
$listName: String!,
$itemContent: String!
) @transaction {
# Step 1
todoList_insert(data: {
id_expr: "uuidV4()",
name: $listName,
})
# Step 2:
todo_insert(data: {
listId_expr: "response.todoList_insert.id" # <-- Grab the newly generated ID from the partial response so far.
content: $itemContent,
})
}
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 | İlişkilendirme |
---|---|---|
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şkilendirilen her kimlik sağlayıcı için benzersiz tanımlayıcı dizileridir. Örneğin, auth.token.firebase.identities["google.com"][0] , hesapla ilişkilendirilen 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.
|