این راهنمای مرجع، نحو زبان عبارت مشترک (CEL) مربوط به ایجاد عبارات برای دستورالعملهای @auth(expr:)
و @check(expr:)
را پوشش میدهد.
اطلاعات مرجع کامل برای CEL در مشخصات CEL ارائه شده است.
متغیرهای آزمایشی در پرس و جوها و جهشها تصویب شدند
نحو @auth(expr)
به شما امکان می دهد به متغیرهای جستجو و جهش دسترسی داشته باشید و آنها را آزمایش کنید.
برای مثال، میتوانید یک متغیر عملیاتی، مانند $status
با استفاده از vars.status
اضافه کنید.
mutation Update($id: UUID!, $status: Any) @auth(expr: "has(vars.status)")
داده های موجود برای عبارات
هر دو عبارت @auth(expr:)
و @check(expr:)
CEL می توانند موارد زیر را ارزیابی کنند:
-
request.operationName
-
vars
(نام مستعارrequest.variables
) -
auth
(مستعارrequest.auth
)
علاوه بر این، عبارات @check(expr:)
می توانند ارزیابی کنند:
-
this
(مقدار فیلد فعلی)
شی request.operationName
شی request.operarationName
نوع عملیات، پرس و جو یا جهش را ذخیره می کند.
شی vars
آبجکت vars
به عبارات شما اجازه می دهد تا به تمام متغیرهای ارسال شده در پرس و جو یا جهش شما دسترسی داشته باشند.
می توانید از 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
Authentication کاربرانی را که درخواست دسترسی به دادههای شما را دارند شناسایی میکند و آن اطلاعات را به عنوان یک شی که میتوانید در عبارات خود بر روی آن بسازید، ارائه میکند.
در فیلترها و عبارات خود، می توانید auth
به عنوان نام مستعار request.auth
استفاده کنید.
شی auth حاوی اطلاعات زیر است:
-
uid
: یک شناسه کاربری منحصر به فرد که به کاربر درخواست کننده اختصاص داده می شود. -
token
: نقشه ای از مقادیر جمع آوری شده توسط Authentication .
برای جزئیات بیشتر در مورد محتوای auth.token
به داده ها در نشانه های auth مراجعه کنید
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 به آن دسترسی داشته باشید. |