تتناول أدلة البيانات المرجعية هذه بنية لغة التعبير الشائعة (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:)
تقييم العناصر التالية:
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
.
يحتوي عنصر المصادقة على المعلومات التالية:
-
uid
: معرّف مستخدم فريد تمّ تعيينه للمستخدم الذي قدّم الطلب. token
: خريطة للقيم التي جمعها Authentication
لمزيد من التفاصيل حول محتوى auth.token
، يُرجى الاطّلاع على
البيانات في الرموز المميّزة لمنح الأذونات.
عملية ربط 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() a.f |
الوصول إلى الفهرس والطلب والحقل | من اليسار إلى اليمين |
!a -a |
النفي الأحادي | من اليمين إلى اليسار |
a/b a%b a*b |
عوامل التشغيل المتعددة | من اليسار إلى اليمين |
a+b a-b |
عوامل التشغيل التي تُضيف قيمًا | من اليسار إلى اليمين |
a>b a>=b a<b a<=b |
عوامل التشغيل الارتباطية | من اليسار إلى اليمين |
a in b |
التواجد في قائمة أو خريطة | من اليسار إلى اليمين |
type(a) == t |
مقارنة النوع، حيث يمكن أن يكون t منطقيًا أو عددًا صحيحًا أو عددًا برمجيًا أو
سلسلة أو قائمة أو خريطة أو طابعًا زمنيًا أو مدة |
من اليسار إلى اليمين |
a==b a!=b |
عوامل تشغيل المقارنة | من اليسار إلى اليمين |
a && b |
"و" شَرطي | من اليسار إلى اليمين |
a || b |
أو شرطي | من اليسار إلى اليمين |
a ? true_value : false_value |
تعبير ثلاثي | من اليسار إلى اليمين |
البيانات في الرموز المميّزة للمصادقة
قد يحتوي عنصر auth.token
على القيم التالية:
الحقل | الوصف |
---|---|
email |
عنوان البريد الإلكتروني المرتبط بالحساب، إن توفّر |
email_verified |
true إذا أثبت المستخدم أنّه يمكنه الوصول إلى عنوان email . يُثبت بعض مقدّمي الخدمة تلقائيًا ملكية عناوين البريد الإلكتروني التي يمتلكونها. |
phone_number |
رقم الهاتف المرتبط بالحساب، إن توفّر |
name |
الاسم المعروض للمستخدم، في حال ضبطه |
sub |
معرّف 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
يمكنك أيضًا الوصول إلى حقول auth.token
التالية:
مطالبات الرموز المميّزة المخصّصة | ||
---|---|---|
alg |
خوارزمية | "RS256" |
iss |
جهة الإصدار | عنوان البريد الإلكتروني لحساب الخدمة الخاص بمشروعك |
sub |
الموضوع | عنوان البريد الإلكتروني لحساب الخدمة الخاص بمشروعك |
aud |
الجمهور | "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit" |
iat |
وقت الإصدار | الوقت الحالي، بالثواني منذ بداية حقبة UNIX |
exp |
وقت انتهاء الصلاحية |
الوقت الذي تنتهي فيه صلاحية الرمز المميّز، بالثواني منذ بداية حقبة يونكس يمكن أن يليه
المحتوى بعد 3600 ثانية كحد أقصى من iat .
ملاحظة: لا يتحكّم هذا الإعداد إلا في وقت انتهاء صلاحية الرمز المميّز المخصّص نفسه. ولكن بعد تسجيل دخول مستخدم باستخدام signInWithCustomToken() ، سيظل مسجِّلاً الدخول إلى
الجهاز إلى أن تصبح جلسته غير صالحة أو يسجّل المستخدم الخروج.
|
<claims> (اختياري) |
مطالبات مخصّصة اختيارية لتضمينها في الرمز المميّز، ويمكن الوصول إليها من خلال
auth.token (أو request.auth.token ) في
التعبيرات. على سبيل المثال، إذا أنشأت مطالبة مخصّصة
adminClaim ، يمكنك الوصول إليها باستخدام
auth.token.adminClaim .
|