این راهنمای مرجع، نحو زبان عبارت مشترک (CEL) مربوط به ایجاد عبارات برای دستورالعملهای @auth(expr:)
و @check(expr:)
را پوشش میدهد.
اطلاعات مرجع کامل برای CEL در مشخصات CEL ارائه شده است.
متغیرهای آزمایشی در پرس و جوها و جهشها تصویب شدند
نحو @auth(expr)
به شما امکان می دهد به متغیرهای جستجو و جهش دسترسی داشته باشید و آنها را آزمایش کنید.
برای مثال، میتوانید یک متغیر عملیاتی، مانند $status
با استفاده از vars.status
اضافه کنید.
mutation Update($id: UUID!, $status: Any) @auth(expr: "has(vars.status)")
داده های موجود برای عبارات: درخواست، پاسخ، این
شما از داده ها برای موارد زیر استفاده می کنید:
- ارزیابی با عبارات CEL در دستورالعملهای
@auth(expr:)
و@check(expr:)
- تخصیص با استفاده از عبارات سرور،
<field>_expr
.
هر دو عبارت @auth(expr:)
و @check(expr:)
CEL می توانند موارد زیر را ارزیابی کنند:
-
request.operationName
-
vars
(نام مستعارrequest.variables
) -
auth
(مستعارrequest.auth
)
در جهشها، میتوانید به محتویات زیر دسترسی داشته باشید و به آنها اختصاص دهید:
-
response
(برای بررسی نتایج جزئی در منطق چند مرحله ای)
علاوه بر این، عبارات @check(expr:)
می توانند ارزیابی کنند:
-
this
(مقدار فیلد فعلی) -
response
(برای بررسی نتایج جزئی در منطق چند مرحله ای)
درخواست.operationName binding
request.operarationName
binding نوع عملیات، پرس و جو یا جهش را ذخیره می کند.
vars
binding (request.vars)
vars
binding به عبارات شما اجازه می دهد تا به تمام متغیرهای ارسال شده در پرس و جو یا جهش شما دسترسی داشته باشند.
می توانید vars.<variablename>
در یک عبارت به عنوان نام مستعار برای request.variables.<variablename>
:
# The following are equivalent
mutation StringType($v: String!) @auth(expr: "vars.v == 'hello'")
mutation StringType($v: String!) @auth(expr: "request.variables.v == 'hello'")
auth
binding (request.auth)
Authentication کاربرانی را که درخواست دسترسی به دادههای شما را دارند شناسایی میکند و این اطلاعات را به عنوان یک الزامآور در اختیار شما قرار میدهد که میتوانید در عبارات خود بر روی آن بسازید.
در فیلترها و عبارات خود، می توانید auth
به عنوان نام مستعار request.auth
استفاده کنید.
صحافی اعتبار حاوی اطلاعات زیر است:
-
uid
: یک شناسه کاربری منحصر به فرد که به کاربر درخواست کننده اختصاص داده می شود. -
token
: نقشه ای از مقادیر جمع آوری شده توسط Authentication .
برای جزئیات بیشتر در مورد محتویات auth.token
به داده ها در نشانه های auth مراجعه کنید
الزام آور response
اتصال response
شامل داده هایی است که توسط سرور در پاسخ به یک پرس و جو یا جهش هنگام جمع آوری داده ها جمع آوری می شود .
همانطور که عملیات ادامه می یابد، با تکمیل موفقیت آمیز هر مرحله، response
حاوی داده های پاسخ از مراحلی است که با موفقیت انجام شده است.
اتصال response
بر اساس شکل عملیات مرتبط با آن، از جمله (چندین) فیلدهای تودرتو و (در صورت وجود) پرس و جوهای جاسازی شده، ساختار یافته است.
توجه داشته باشید که وقتی به دادههای پاسخ پرس و جوی تعبیهشده دسترسی پیدا میکنید، فیلدها میتوانند حاوی هر نوع دادهای باشند، بسته به دادههای درخواستی در جستار تعبیهشده. هنگامی که به دادههای بازگردانده شده توسط فیلدهای جهش مانند _insert
s و _delete
دسترسی پیدا میکنید، ممکن است حاوی کلیدهای UUID، تعداد حذفها، null باشد (به مرجع جهشها مراجعه کنید).
به عنوان مثال:
- در جهشی که حاوی یک جستار تعبیه شده است، پیوند
response
حاوی داده های جستجو درresponse.query.<fieldName>.<fieldName>....
، در این موردresponse.query.todoList
وresponse.query.todoList.priority
.
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
}
}
}
- در یک جهش چند مرحلهای، برای مثال با چندین فیلد
_insert
، پیوندresponse
حاوی دادههای جزئی درresponse.<fieldName>.<fieldName>....
، در این موردresponse.todoList_insert.id
.
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
الزام آور
اتصال this
به فیلدی که دستور @check
به آن پیوست شده است ارزیابی می شود. در یک مورد اساسی، ممکن است نتایج پرس و جوی تک ارزشی را ارزیابی کنید.
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
})
}
اگر فیلد برگشتی چندین بار رخ دهد زیرا هر اجدادی یک لیست است، هر رخداد با this
کران به هر مقدار آزمایش می شود.
برای هر مسیر معین، اگر یک جد null
یا []
باشد، به فیلد دسترسی پیدا نمیکند و ارزیابی CEL برای آن مسیر نادیده گرفته میشود. به عبارت دیگر، ارزیابی تنها زمانی صورت میگیرد this
null
یا غیر null
باشد، اما هرگز undefined
.
هنگامی که فیلد به خودی خود یک لیست یا شی باشد، this
همان ساختار (شامل تمام فرزندان انتخاب شده در مورد اشیا) پیروی می کند، همانطور که در مثال زیر نشان داده شده است.
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
})
}
نحو عبارت پیچیده
می توانید با ترکیب کردن با &&
و ||
عبارات پیچیده تری بنویسید اپراتورها
mutation UpsertUser($username: String!) @auth(expr: "(auth != null) && (vars.username == 'joe')")
بخش زیر تمام اپراتورهای موجود را توضیح می دهد.
اپراتورها و تقدم عملگر
از جدول زیر به عنوان مرجع برای عملگرها و اولویت مربوط به آنها استفاده کنید.
عبارات دلخواه a
و b
، یک فیلد f
و یک شاخص i
داده می شود.
اپراتور | توضیحات | انجمنی |
---|---|---|
a[i] a() af | فهرست، تماس، دسترسی به میدان | چپ به راست |
!a -a | نفی واحد | راست به چپ |
a/ba%ba*b | عملگرهای ضربی | چپ به راست |
a+b ab | اپراتورهای افزودنی | چپ به راست |
a>b a>=b a<b a<=b | عملگرهای رابطه ای | چپ به راست |
a in b | وجود در فهرست یا نقشه | چپ به راست |
type(a) == t | مقایسه نوع، جایی که t می تواند bool، int، float، عدد، رشته، فهرست، نقشه، مهر زمانی یا مدت باشد. | چپ به راست |
a==ba!=b | عملگرهای مقایسه | چپ به راست |
a && b | AND مشروط | چپ به راست |
a || b | OR مشروط | چپ به راست |
a ? true_value : false_value | بیان سه تایی | چپ به راست |
داده ها در توکن های احراز هویت
شی auth.token
ممکن است حاوی مقادیر زیر باشد:
میدان | توضیحات |
---|---|
email | آدرس ایمیل مرتبط با حساب، در صورت وجود. |
email_verified | true اگر کاربر تأیید کرده باشد که به آدرس email دسترسی دارد. برخی از ارائه دهندگان به طور خودکار آدرس های ایمیل خود را تأیید می کنند. |
phone_number | شماره تلفن مرتبط با حساب، در صورت وجود. |
name | نام نمایشی کاربر، در صورت تنظیم. |
sub | UID Firebase کاربر. این در یک پروژه منحصر به فرد است. |
firebase.identities | فرهنگ لغت همه هویت هایی که با حساب این کاربر مرتبط هستند. کلیدهای فرهنگ لغت می توانند یکی از موارد زیر باشند: email ، phone ، google.com ، facebook.com ، github.com ، twitter.com . مقادیر فرهنگ لغت آرایههایی از شناسههای منحصربهفرد برای هر ارائهدهنده هویت مرتبط با حساب است. برای مثال، auth.token.firebase.identities["google.com"][0] حاوی اولین شناسه کاربری Google مرتبط با حساب است. |
firebase.sign_in_provider | ارائهدهنده ورود به سیستم برای دریافت این رمز استفاده میکند. می تواند یکی از رشته های زیر باشد: custom ، password ، phone ، anonymous ، google.com ، facebook.com ، github.com ، twitter.com . |
firebase.tenant | شناسه مستاجر مرتبط با حساب، در صورت وجود. به عنوان مثال، tenant2-m6tyz |
فیلدهای اضافی در توکن های JWT ID
همچنین می توانید به فیلدهای auth.token
زیر دسترسی داشته باشید:
ادعاهای توکن سفارشی | ||
---|---|---|
alg | الگوریتم | "RS256" |
iss | صادر کننده | آدرس ایمیل حساب سرویس پروژه شما |
sub | موضوع | آدرس ایمیل حساب سرویس پروژه شما |
aud | مخاطب | "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit" |
iat | صادر شده در زمان | زمان فعلی، در ثانیه از دوران یونیکس |
exp | زمان انقضا | زمان، بر حسب ثانیه از دوره یونیکس، که در آن توکن منقضی میشود. می تواند حداکثر 3600 ثانیه دیرتر از iat باشد.توجه: این فقط زمانی را کنترل می کند که خود توکن سفارشی منقضی شود. اما هنگامی که کاربر را با استفاده از signInWithCustomToken() وارد سیستم کردید، تا زمانی که جلسه آنها باطل شود یا کاربر از سیستم خارج نشود، وارد دستگاه میشوند. |
<claims> (اختیاری) | ادعای سفارشی اختیاری برای گنجاندن در نشانه، که میتواند از طریق auth.token (یا request.auth.token ) در عبارات قابل دسترسی باشد. برای مثال، اگر یک ادعای سفارشی adminClaim ایجاد کنید، میتوانید با auth.token.adminClaim به آن دسترسی داشته باشید. |