ডেটা সংযোগের জন্য সাধারণ অভিব্যক্তি ভাষা সিনট্যাক্স রেফারেন্স

এই রেফারেন্স গাইডগুলি @auth(expr:) এবং @check(expr:) নির্দেশাবলীর জন্য অভিব্যক্তি তৈরির জন্য প্রাসঙ্গিক কমন এক্সপ্রেশন ল্যাঙ্গুয়েজ (CEL) সিনট্যাক্স কভার করে।

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 আপনার ডেটা অ্যাক্সেসের অনুরোধকারী ব্যবহারকারীদের সনাক্ত করে এবং সেই তথ্যটিকে একটি বস্তু হিসাবে প্রদান করে যা আপনি আপনার অভিব্যক্তিতে তৈরি করতে পারেন।

আপনার ফিল্টার এবং এক্সপ্রেশনে, আপনি request.auth এর জন্য একটি উপনাম হিসাবে auth ব্যবহার করতে পারেন।

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() 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 শর্তাধীন এবং বাম থেকে ডান
a || b শর্তাধীন বা বাম থেকে ডান
a ? true_value : false_value টার্নারি এক্সপ্রেশন বাম থেকে ডান

প্রমাণীকরণ টোকেনে ডেটা

auth.token অবজেক্টে নিম্নলিখিত মান থাকতে পারে:

মাঠ বর্ণনা
email অ্যাকাউন্টের সাথে যুক্ত ইমেল ঠিকানা, যদি উপস্থিত থাকে।
email_verified true যদি ব্যবহারকারী যাচাই করে থাকে যে তাদের email ঠিকানায় অ্যাক্সেস আছে। কিছু প্রদানকারী স্বয়ংক্রিয়ভাবে তাদের মালিকানাধীন ইমেল ঠিকানা যাচাই করে।
phone_number অ্যাকাউন্টের সাথে যুক্ত ফোন নম্বর, যদি উপস্থিত থাকে।
name ব্যবহারকারীর প্রদর্শনের নাম, যদি সেট করা থাকে।
sub ব্যবহারকারীর Firebase UID. এটি একটি প্রকল্পের মধ্যে অনন্য।
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 ইস্যু করা সময়ে বর্তমান সময়, ইউনিক্স যুগের পর থেকে সেকেন্ডে
exp মেয়াদ শেষ হওয়ার সময় সময়, UNIX যুগ থেকে সেকেন্ডে, যে সময়ে টোকেনের মেয়াদ শেষ হয়। এটি iat এর চেয়ে সর্বোচ্চ 3600 সেকেন্ড পরে হতে পারে।
দ্রষ্টব্য: এটি শুধুমাত্র সেই সময়টিকে নিয়ন্ত্রণ করে যখন কাস্টম টোকেনের মেয়াদ শেষ হয়ে যায়। কিন্তু একবার আপনি signInWithCustomToken() ব্যবহার করে কোনো ব্যবহারকারীকে সাইন ইন করলে, তাদের সেশন বাতিল না হওয়া পর্যন্ত বা ব্যবহারকারী সাইন আউট না হওয়া পর্যন্ত তারা ডিভাইসে সাইন ইন থাকবে।
<claims> (ঐচ্ছিক) ঐচ্ছিক কাস্টম দাবি টোকেনে অন্তর্ভুক্ত করার জন্য, যা এক্সপ্রেশনে auth.token (বা request.auth.token ) এর মাধ্যমে অ্যাক্সেস করা যেতে পারে। উদাহরণস্বরূপ, আপনি যদি একটি কাস্টম দাবি adminClaim তৈরি করেন, আপনি auth.token.adminClaim এর মাধ্যমে এটি অ্যাক্সেস করতে পারেন।