مرجع نحو زبان Common Expression برای Data Connect

این راهنمای مرجع، نحو زبان عبارت مشترک (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 به آن دسترسی داشته باشید.