এই রেফারেন্স গাইডে @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> <variablename> এর জন্য একটি উপনাম হিসেবে একটি এক্সপ্রেশনে vars.<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 এর জন্য auth একটি উপনাম হিসেবে ব্যবহার করতে পারেন।
প্রমাণীকরণ বাইন্ডিংয়ে নিম্নলিখিত তথ্য রয়েছে:
-
uid: অনুরোধকারী ব্যবহারকারীকে নির্ধারিত একটি অনন্য ব্যবহারকারী আইডি। -
token: Authentication দ্বারা সংগৃহীত মানগুলির একটি মানচিত্র।
auth.token এর বিষয়বস্তু সম্পর্কে আরও বিস্তারিত জানার জন্য auth টোকেনে ডেটা দেখুন।
response বাঁধাই
response বাইন্ডিং-এ সার্ভার কর্তৃক একত্রিত করা ডেটা থাকে যখন কোনও কোয়েরি বা মিউটেশনের প্রতিক্রিয়ায় সেই ডেটা একত্রিত করা হয় ।
ক্রিয়াকলাপটি এগিয়ে যাওয়ার সাথে সাথে, প্রতিটি ধাপ সফলভাবে সম্পন্ন হওয়ার সাথে সাথে, response সফলভাবে সম্পন্ন পদক্ষেপগুলি থেকে প্রতিক্রিয়া ডেটা থাকে।
response বাইন্ডিংটি তার সংশ্লিষ্ট ক্রিয়াকলাপের আকার অনুসারে গঠন করা হয়, যার মধ্যে (একাধিক) নেস্টেড ক্ষেত্র এবং (যদি প্রযোজ্য হয়) এমবেডেড কোয়েরি অন্তর্ভুক্ত থাকে।
মনে রাখবেন যে যখন আপনি এমবেডেড কোয়েরি রেসপন্স ডেটা অ্যাক্সেস করেন, তখন এম্বেডেড কোয়েরিতে অনুরোধ করা ডেটার উপর নির্ভর করে ফিল্ডগুলিতে যেকোনো ডেটা টাইপ থাকতে পারে; যখন আপনি _insert s এবং _delete s এর মতো মিউটেশন ফিল্ড দ্বারা ফেরত ডেটা অ্যাক্সেস করেন, তখন সেগুলিতে UUID কী, ডিলিটের সংখ্যা, নাল থাকতে পারে ( মিউটেশনের রেফারেন্স দেখুন)।
উদাহরণস্বরূপ:
- একটি এমবেডেড কোয়েরি ধারণকারী মিউটেশনের ক্ষেত্রে,
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 | শর্তসাপেক্ষ OR | বাম থেকে ডানে |
a ? true_value : false_value | টারনারি এক্সপ্রেশন | বাম থেকে ডানে |
প্রমাণীকরণ টোকেনে ডেটা
auth.token অবজেক্টে নিম্নলিখিত মান থাকতে পারে:
| মাঠ | বিবরণ |
|---|---|
email | অ্যাকাউন্টের সাথে সম্পর্কিত ইমেল ঠিকানা, যদি থাকে। |
email_verified | ব্যবহারকারী যদি যাচাই করে থাকেন যে তাদের email ঠিকানায় অ্যাক্সেস আছে, তাহলে true । কিছু প্রদানকারী স্বয়ংক্রিয়ভাবে তাদের মালিকানাধীন ইমেল ঠিকানা যাচাই করে। |
phone_number | অ্যাকাউন্টের সাথে সম্পর্কিত ফোন নম্বর, যদি থাকে। |
name | ব্যবহারকারীর প্রদর্শন নাম, যদি সেট করা থাকে। |
sub | ব্যবহারকারীর ফায়ারবেস ইউআইডি। এটি একটি প্রকল্পের মধ্যে অনন্য। |
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 | অ্যাকাউন্টের সাথে সম্পর্কিত tenant Id, যদি থাকে। উদাহরণস্বরূপ, tenant2-m6tyz |
JWT আইডি টোকেনের অতিরিক্ত ক্ষেত্র
আপনি নিম্নলিখিত auth.token ক্ষেত্রগুলিও অ্যাক্সেস করতে পারেন:
| কাস্টম টোকেন দাবি | ||
|---|---|---|
alg | অ্যালগরিদম | "RS256" |
iss | ইস্যুকারী | আপনার প্রকল্পের পরিষেবা অ্যাকাউন্টের ইমেল ঠিকানা |
sub | বিষয় | আপনার প্রকল্পের পরিষেবা অ্যাকাউন্টের ইমেল ঠিকানা |
aud | পাঠকবর্গ | "https://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit" |
iat | ইস্যুকৃত সময় | UNIX যুগের পর থেকে বর্তমান সময়, সেকেন্ডে |
exp | মেয়াদ শেষ হওয়ার সময় | UNIX যুগের পর থেকে সেকেন্ডে যে সময়ে টোকেনের মেয়াদ শেষ হয়। এটি iat এর চেয়ে সর্বোচ্চ ৩৬০০ সেকেন্ড পরে হতে পারে।দ্রষ্টব্য: এটি শুধুমাত্র কাস্টম টোকেনের মেয়াদ শেষ হওয়ার সময় নিয়ন্ত্রণ করে। কিন্তু একবার আপনি signInWithCustomToken() ব্যবহার করে একজন ব্যবহারকারীকে সাইন ইন করলে, তাদের সেশন অবৈধ না হওয়া পর্যন্ত বা ব্যবহারকারী সাইন আউট না হওয়া পর্যন্ত তারা ডিভাইসে সাইন ইন থাকবে। |
<claims> (ঐচ্ছিক) | টোকেনে অন্তর্ভুক্ত করার জন্য ঐচ্ছিক কাস্টম দাবি, যা এক্সপ্রেশনে auth.token (অথবা request.auth.token ) এর মাধ্যমে অ্যাক্সেস করা যেতে পারে। উদাহরণস্বরূপ, যদি আপনি একটি কাস্টম দাবি adminClaim তৈরি করেন, তাহলে আপনি auth.token.adminClaim দিয়ে এটি অ্যাক্সেস করতে পারেন। | |