এই নির্দেশিকাটিতে @auth(expr:) এবং @check(expr:) নির্দেশাবলীর জন্য এক্সপ্রেশন তৈরির সাথে প্রাসঙ্গিক কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (CEL) সিনট্যাক্স আলোচনা করা হয়েছে।
CEL সংক্রান্ত পূর্ণাঙ্গ তথ্য CEL স্পেসিফিকেশনে প্রদান করা হয়েছে।
কোয়েরি এবং মিউটেশনে পাস করা টেস্ট ভেরিয়েবল
@auth(expr) সিনট্যাক্স আপনাকে কোয়েরি এবং মিউটেশন থেকে ভেরিয়েবল অ্যাক্সেস ও পরীক্ষা করার সুযোগ দেয়।
উদাহরণস্বরূপ, আপনি vars.status ব্যবহার করে $status মতো একটি অপারেশন ভেরিয়েবল অন্তর্ভুক্ত করতে পারেন।
mutation Update($id: UUID!, $status: Any) @auth(expr: "has(vars.status)")
এক্সপ্রেশনের জন্য উপলব্ধ ডেটা: অনুরোধ, প্রতিক্রিয়া, এই
আপনি ডেটা ব্যবহার করেন:
-
@auth(expr:)এবং@check(expr:)নির্দেশাবলীতে CEL এক্সপ্রেশন ব্যবহার করে মূল্যায়ন - সার্ভার এক্সপ্রেশন ব্যবহার করে অ্যাসাইনমেন্ট,
<field>_expr.
@auth(expr:) এবং @check(expr:) উভয় CEL এক্সপ্রেশনই নিম্নলিখিত বিষয়গুলো মূল্যায়ন করতে পারে:
-
request.operationName -
vars(request.variablesএর বিকল্প নাম) -
auth(request.authএর বিকল্প নাম)
মিউটেশন-এর ক্ষেত্রে, আপনি নিম্নলিখিতগুলির বিষয়বস্তু অ্যাক্সেস এবং নির্ধারণ করতে পারেন:
-
response(বহু-ধাপ যুক্তিতে আংশিক ফলাফল যাচাই করার জন্য)
এছাড়াও, @check(expr:) এক্সপ্রেশনগুলো মূল্যায়ন করতে পারে:
-
this(বর্তমান ফিল্ডের মান) -
response(বহু-ধাপ যুক্তিতে আংশিক ফলাফল যাচাই করার জন্য)
request.operationName বাইন্ডিং
request.operarationName বাইন্ডিংটি অপারেশনের ধরণ, অর্থাৎ কোয়েরি অথবা মিউটেশন, সংরক্ষণ করে।
vars বাইন্ডিং (request.vars)
vars বাইন্ডিং আপনার এক্সপ্রেশনকে কোয়েরি বা মিউটেশনে পাস করা সমস্ত ভেরিয়েবল অ্যাক্সেস করার সুযোগ দেয়।
আপনি কোনো এক্সপ্রেশনে সম্পূর্ণ request.variables.<variablename> vars.<variablename> <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 বাইন্ডিং (request.auth)
Authentication আপনার ডেটাতে অ্যাক্সেসের অনুরোধকারী ব্যবহারকারীদের শনাক্ত করে এবং সেই তথ্যকে একটি বাইন্ডিং হিসেবে প্রদান করে, যার উপর ভিত্তি করে আপনি আপনার এক্সপ্রেশন তৈরি করতে পারেন।
আপনার ফিল্টার এবং এক্সপ্রেশনে, আপনি request.auth এর উপনাম (alias) হিসেবে auth ব্যবহার করতে পারেন।
অথোরাইজেশন বাইন্ডিং-এ নিম্নলিখিত তথ্য রয়েছে:
-
uid: অনুরোধকারী ব্যবহারকারীকে বরাদ্দ করা একটি অনন্য ব্যবহারকারী আইডি। -
token: Authentication দ্বারা সংগৃহীত মানগুলির একটি ম্যাপ।
auth.token এর বিষয়বস্তু সম্পর্কে আরও বিস্তারিত জানতে auth tokens-এর ডেটা দেখুন।
response বাইন্ডিং
কোনো কোয়েরি বা মিউটেশনের প্রতিক্রিয়ায় সার্ভার কর্তৃক সংগৃহীত ডেটা , ডেটা সংগ্রহের মুহূর্তেই response বাইন্ডিং-এ ধারণ করা থাকে।
অপারেশনটি অগ্রসর হওয়ার সাথে সাথে, প্রতিটি ধাপ সফলভাবে সম্পন্ন হলে, response সফলভাবে সম্পন্ন হওয়া ধাপগুলোর প্রতিক্রিয়া ডেটা অন্তর্ভুক্ত থাকে।
response বাইন্ডিংটি এর সংশ্লিষ্ট অপারেশনের গঠন অনুসারে তৈরি করা হয়, যার মধ্যে (একাধিক) নেস্টেড ফিল্ড এবং (প্রযোজ্য ক্ষেত্রে) এমবেডেড কোয়েরি অন্তর্ভুক্ত থাকে।
মনে রাখবেন যে, যখন আপনি এমবেডেড কোয়েরি রেসপন্স ডেটা অ্যাক্সেস করেন, তখন এমবেডেড কোয়েরিতে অনুরোধ করা ডেটার উপর নির্ভর করে ফিল্ডগুলিতে যেকোনো ডেটা টাইপ থাকতে পারে; যখন আপনি _insert এবং _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 বা non- 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, number, string, list, map, timestamp, বা duration | বাম থেকে ডানে |
a==ba!=b | তুলনা অপারেটর | বাম থেকে ডানে |
a && b | শর্তসাপেক্ষ এবং | বাম থেকে ডানে |
a || b | শর্তসাপেক্ষ অথবা | বাম থেকে ডানে |
a ? true_value : false_value | ত্রয়ী অভিব্যক্তি | বাম থেকে ডানে |
প্রমাণীকরণ টোকেনের ডেটা
auth.token অবজেক্টটিতে নিম্নলিখিত মানগুলি থাকতে পারে:
| মাঠ | বর্ণনা |
|---|---|
email | অ্যাকাউন্টের সাথে যুক্ত ইমেল ঠিকানা, যদি থাকে। |
email_verified | যদি ব্যবহারকারী যাচাই করে থাকেন যে email ঠিকানাটিতে তার প্রবেশাধিকার আছে, তবে true । কিছু পরিষেবা প্রদানকারী তাদের মালিকানাধীন ইমেল ঠিকানাগুলো স্বয়ংক্রিয়ভাবে যাচাই করে। |
phone_number | অ্যাকাউন্টের সাথে যুক্ত ফোন নম্বর, যদি থাকে। |
name | ব্যবহারকারীর প্রদর্শিত নাম, যদি সেট করা থাকে। |
sub | ব্যবহারকারীর ফায়ারবেস ইউআইডি। এটি একটি প্রোজেক্টের মধ্যে অনন্য। |
firebase.identities | এই ব্যবহারকারীর অ্যাকাউন্টের সাথে যুক্ত সমস্ত পরিচয়ের একটি ডিকশনারি। ডিকশনারিটির কী (key) নিম্নলিখিতগুলির যেকোনো একটি হতে পারে: email , phone , google.com , facebook.com , github.com , twitter.com । ডিকশনারিটির ভ্যালু (value) হলো অ্যাকাউন্টের সাথে যুক্ত প্রতিটি আইডেন্টিটি প্রোভাইডারের জন্য অনন্য শনাক্তকারীর অ্যারে। উদাহরণস্বরূপ, auth.token.firebase.identities["google.com"][0] এ অ্যাকাউন্টের সাথে যুক্ত প্রথম গুগল ইউজার আইডি রয়েছে। |
firebase.sign_in_provider | এই টোকেনটি পেতে ব্যবহৃত সাইন-ইন প্রদানকারী। এটি নিম্নলিখিত স্ট্রিংগুলির মধ্যে একটি হতে পারে: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com । |
firebase.tenant | অ্যাকাউন্টের সাথে যুক্ত tenantId, যদি থাকে। উদাহরণস্বরূপ, tenant2-m6tyz |
JWT আইডি টোকেনগুলিতে অতিরিক্ত ক্ষেত্র
আপনি নিম্নলিখিত auth.token ফিল্ডগুলিও অ্যাক্সেস করতে পারেন:
| কাস্টম টোকেন দাবি | ||
|---|---|---|
alg | অ্যালগরিদম | "RS256" |
iss | ইস্যুকারী | আপনার প্রকল্পের পরিষেবা অ্যাকাউন্টের ইমেল ঠিকানা |
sub | বিষয় | আপনার প্রকল্পের পরিষেবা অ্যাকাউন্টের ইমেল ঠিকানা |
aud | দর্শক | "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit" |
iat | ইস্যু-সময় | ইউনিক্স ইপক থেকে বর্তমান সময়, সেকেন্ডে। |
exp | মেয়াদ শেষ হওয়ার সময় | ইউনিক্স ইপক থেকে সেকেন্ডে সেই সময়, যে সময়ে টোকেনটির মেয়াদ শেষ হয়। এটি iat এর চেয়ে সর্বোচ্চ ৩৬০০ সেকেন্ড পরে হতে পারে।দ্রষ্টব্য: এটি শুধুমাত্র কাস্টম টোকেনটির মেয়াদ শেষ হওয়ার সময় নিয়ন্ত্রণ করে। কিন্তু একবার আপনি signInWithCustomToken() ব্যবহার করে কোনো ব্যবহারকারীকে সাইন ইন করালে, তাদের সেশন বাতিল না হওয়া পর্যন্ত বা ব্যবহারকারী সাইন আউট না করা পর্যন্ত তারা ডিভাইসে সাইন ইন করা অবস্থায় থাকবে। |
<claims> (ঐচ্ছিক) | টোকেনে অন্তর্ভুক্ত করার জন্য ঐচ্ছিক কাস্টম ক্লেইম রয়েছে, যা এক্সপ্রেশনে auth.token (বা request.auth.token )-এর মাধ্যমে অ্যাক্সেস করা যায়। উদাহরণস্বরূপ, যদি আপনি adminClaim নামে একটি কাস্টম ক্লেইম তৈরি করেন, তবে আপনি auth.token.adminClaim দিয়ে এটি অ্যাক্সেস করতে পারবেন। | |