Firebase ক্লাউড স্টোরেজ নিরাপত্তা নিয়মে শর্তাবলী ব্যবহার করুন

Cloud Storage জন্য আপনার Firebase Security Rules কীভাবে শর্ত যোগ করতে হয় তা দেখানোর জন্য এই গাইড Firebase Security Rules ভাষা নির্দেশিকাটির মূল সিনট্যাক্স শিখতে তৈরি করে।

Cloud Storage Security Rules প্রাথমিক বিল্ডিং ব্লক শর্ত । একটি শর্ত একটি বুলিয়ান অভিব্যক্তি যা নির্ধারণ করে যে একটি নির্দিষ্ট অপারেশন অনুমোদিত বা অস্বীকার করা উচিত। মৌলিক নিয়মের জন্য, শর্ত হিসাবে true এবং false আক্ষরিক ব্যবহার পুরোপুরি ভাল কাজ করে। কিন্তু Cloud Storage ভাষার জন্য Firebase Security Rules আপনাকে আরও জটিল অবস্থা লিখতে পারে যা করতে পারে:

  • ব্যবহারকারীর প্রমাণীকরণ পরীক্ষা করুন
  • ইনকামিং ডেটা যাচাই করুন

প্রমাণীকরণ

Cloud Storage জন্য Firebase Security Rules Cloud Storage শক্তিশালী ব্যবহারকারী ভিত্তিক প্রমাণীকরণ প্রদান করতে Firebase Authentication সাথে একীভূত করে৷ এটি Firebase Authentication টোকেনের দাবির উপর ভিত্তি করে দানাদার অ্যাক্সেস নিয়ন্ত্রণের অনুমতি দেয়।

যখন একজন প্রমাণীকৃত ব্যবহারকারী Cloud Storage বিরুদ্ধে একটি অনুরোধ করেন, তখন request.auth ভেরিয়েবলটি ব্যবহারকারীর uid ( request.auth.uid ) এবং সেই সাথে Firebase Authentication JWT ( request.auth.token ) এর দাবির সাথে জমা হয়।

অতিরিক্তভাবে, কাস্টম প্রমাণীকরণ ব্যবহার করার সময়, অতিরিক্ত দাবিগুলি request.auth.token ফিল্ডে দেখা যায়।

যখন একটি অননুমোদিত ব্যবহারকারী একটি অনুরোধ সম্পাদন করে, তখন request.auth ভেরিয়েবলটি null হয়।

এই ডেটা ব্যবহার করে, ফাইল সুরক্ষিত করার জন্য প্রমাণীকরণ ব্যবহার করার বিভিন্ন সাধারণ উপায় রয়েছে:

  • সর্বজনীন: request.auth উপেক্ষা করুন
  • প্রমাণীকৃত প্রাইভেট: চেক করুন যে request.auth null নয়
  • ব্যবহারকারীর ব্যক্তিগত: চেক করুন যে request.auth.uid একটি পাথ uid সমান
  • গোষ্ঠী ব্যক্তিগত: একটি নির্বাচিত দাবির সাথে মেলে কাস্টম টোকেনের দাবিগুলি পরীক্ষা করুন, বা একটি মেটাডেটা ক্ষেত্র বিদ্যমান আছে কিনা তা দেখতে ফাইল মেটাডেটা পড়ুন

পাবলিক

যে কোনো নিয়ম যা request.auth প্রসঙ্গ বিবেচনা করে না তাকে একটি public নিয়ম হিসাবে বিবেচনা করা যেতে পারে, কারণ এটি ব্যবহারকারীর প্রমাণীকরণের প্রসঙ্গ বিবেচনা করে না। এই নিয়মগুলি গেমের সম্পদ, সাউন্ড ফাইল বা অন্যান্য স্ট্যাটিক সামগ্রীর মতো পাবলিক ডেটা সার্ফেস করার জন্য কার্যকর হতে পারে।

// Anyone to read a public image if the file is less than 100kB
// Anyone can upload a public file ending in '.txt'
match /public/{imageId} {
  allow read: if resource.size < 100 * 1024;
  allow write: if imageId.matches(".*\\.txt");
}

প্রমাণিত ব্যক্তিগত

কিছু ক্ষেত্রে, আপনি আপনার অ্যাপ্লিকেশনের সমস্ত প্রমাণীকৃত ব্যবহারকারীদের দ্বারা ডেটা দেখার যোগ্য হতে চাইতে পারেন, কিন্তু অপ্রমাণিত ব্যবহারকারীদের দ্বারা নয়। null request.auth request.auth

// Require authentication on all internal image reads
match /internal/{imageId} {
  allow read: if request.auth != null;
}

ব্যবহারকারী ব্যক্তিগত

এখন পর্যন্ত request.auth এর সবচেয়ে সাধারণ ব্যবহারের ক্ষেত্রে পৃথক ব্যবহারকারীদের তাদের ফাইলগুলিতে দানাদার অনুমতি প্রদান করা হবে: প্রোফাইল ছবি আপলোড করা থেকে ব্যক্তিগত নথি পড়া পর্যন্ত।

যেহেতু Cloud Storage ফাইলগুলিতে ফাইলটির একটি সম্পূর্ণ "পাথ" থাকে, তাই ব্যবহারকারীর দ্বারা নিয়ন্ত্রিত একটি ফাইল তৈরি করতে যা লাগে তা হল ফাইলের নাম উপসর্গে (যেমন ব্যবহারকারীর uid ) অনন্য, ব্যবহারকারী সনাক্তকারী তথ্য যা চেক করা যেতে পারে। যখন নিয়ম মূল্যায়ন করা হয়:

// Only a user can upload their profile picture, but anyone can view it
match /users/{userId}/profilePicture.png {
  allow read;
  allow write: if request.auth.uid == userId;
}

গ্রুপ ব্যক্তিগত

আরেকটি সমান সাধারণ ব্যবহারের ক্ষেত্রে একটি বস্তুর উপর গোষ্ঠীর অনুমতি প্রদান করা হবে, যেমন একাধিক দলের সদস্যদের একটি ভাগ করা নথিতে সহযোগিতা করার অনুমতি দেওয়া। এটি করার জন্য বিভিন্ন পদ্ধতি রয়েছে:

  • একটি Firebase Authentication কাস্টম টোকেন মিন্ট করুন যাতে একটি গ্রুপ সদস্য সম্পর্কে অতিরিক্ত তথ্য থাকে (যেমন একটি গ্রুপ আইডি)
  • ফাইল মেটাডেটাতে গ্রুপের তথ্য (যেমন একটি গ্রুপ আইডি বা অনুমোদিত uid এর তালিকা) অন্তর্ভুক্ত করুন

একবার এই ডেটা টোকেন বা ফাইল মেটাডেটাতে সংরক্ষণ করা হলে, এটি একটি নিয়মের মধ্যে থেকে উল্লেখ করা যেতে পারে:

// Allow reads if the group ID in your token matches the file metadata's `owner` property
// Allow writes if the group ID is in the user's custom token
match /files/{groupId}/{fileName} {
  allow read: if resource.metadata.owner == request.auth.token.groupId;
  allow write: if request.auth.token.groupId == groupId;
}

মূল্যায়নের জন্য অনুরোধ করুন

Cloud Storage পাঠানো request ব্যবহার করে আপলোড, ডাউনলোড, মেটাডেটা পরিবর্তন এবং মুছে ফেলার মূল্যায়ন করা হয়। উপরে বর্ণিত request.auth অবজেক্টে ব্যবহারকারীর অনন্য আইডি এবং Firebase Authentication পেলোড ছাড়াও, request ভেরিয়েবলটিতে ফাইলের পাথ রয়েছে যেখানে অনুরোধটি করা হচ্ছে, অনুরোধটি পাওয়ার সময় এবং যদি নতুন resource মান থাকে অনুরোধটি একটি লেখা।

request অবজেক্টটিতে ব্যবহারকারীর অনন্য আইডি এবং Firebase Authentication পেলোডও রয়েছে request.auth অবজেক্টে, যা ডক্সের ব্যবহারকারী-ভিত্তিক নিরাপত্তা বিভাগে আরও ব্যাখ্যা করা হবে।

request বস্তুর বৈশিষ্ট্যগুলির একটি সম্পূর্ণ তালিকা নীচে উপলব্ধ:

সম্পত্তি টাইপ বর্ণনা
auth মানচিত্র<string, string> যখন একজন ব্যবহারকারী লগ ইন করেন, তখন uid , ব্যবহারকারীর অনন্য আইডি এবং token প্রদান করে, Firebase Authentication JWT দাবির একটি মানচিত্র। অন্যথায়, এটি null হবে।
params মানচিত্র<string, string> অনুরোধের ক্যোয়ারী প্যারামিটার ধারণকারী ম্যাপ।
path পথ অনুরোধটি সম্পাদিত হচ্ছে এমন একটি path প্রতিনিধিত্ব করে।
resource মানচিত্র<string, string> নতুন সম্পদ মান, শুধুমাত্র write অনুরোধে উপস্থিত।
time টাইমস্ট্যাম্প একটি টাইমস্ট্যাম্প সার্ভারের প্রতিনিধিত্ব করে যে সময়ে অনুরোধটি মূল্যায়ন করা হয়।

সম্পদ মূল্যায়ন

নিয়মগুলি মূল্যায়ন করার সময়, আপনি আপলোড, ডাউনলোড, পরিবর্তিত বা মুছে ফেলা ফাইলের মেটাডেটা মূল্যায়ন করতে চাইতে পারেন। এটি আপনাকে জটিল এবং শক্তিশালী নিয়মগুলি তৈরি করতে দেয় যা কিছু নির্দিষ্ট বিষয়বস্তুর প্রকারের ফাইলগুলিকে আপলোড করার অনুমতি দেয় বা শুধুমাত্র একটি নির্দিষ্ট আকারের চেয়ে বড় ফাইলগুলিকে মুছে ফেলার মতো জিনিসগুলি করে৷

Cloud Storage জন্য Firebase Security Rules resource অবজেক্টে ফাইল মেটাডেটা প্রদান করে, যার মধ্যে মেটাডেটার কী/মান পেয়ার থাকে যা একটি Cloud Storage অবজেক্টে দেখা যায়। ডেটা অখণ্ডতা নিশ্চিত করতে এই বৈশিষ্ট্যগুলি read বা write অনুরোধে পরিদর্শন করা যেতে পারে।

write অনুরোধে (যেমন আপলোড, মেটাডেটা আপডেট এবং মুছে ফেলা) resource অবজেক্ট ছাড়াও, যে ফাইলের জন্য ফাইল মেটাডেটা রয়েছে যা বর্তমানে রিকোয়েস্ট পাথে আছে, আপনার কাছে request.resource অবজেক্ট ব্যবহার করার ক্ষমতাও আছে, যেটিতে ফাইল মেটাডেটার একটি উপসেট রয়েছে যা লেখার অনুমতি দেওয়া হলে লিখতে হবে। আপনি ডেটা অখণ্ডতা নিশ্চিত করতে বা ফাইলের ধরন বা আকারের মতো অ্যাপ্লিকেশন সীমাবদ্ধতা প্রয়োগ করতে এই দুটি মান ব্যবহার করতে পারেন।

resource অবজেক্টের বৈশিষ্ট্যগুলির একটি সম্পূর্ণ তালিকা নীচে উপলব্ধ:

সম্পত্তি টাইপ বর্ণনা
name স্ট্রিং বস্তুর পুরো নাম
bucket স্ট্রিং এই বস্তুটি যে বালতিতে থাকে তার নাম।
generation int এই অবজেক্টের Google Cloud Storage অবজেক্ট জেনারেশন
metageneration int Google Cloud Storage অবজেক্ট এই অবজেক্টের মেটাজেনারেশন
size int বাইটে বস্তুর আকার।
timeCreated টাইমস্ট্যাম্প একটি টাইমস্ট্যাম্প যা একটি বস্তু তৈরি করার সময়কে প্রতিনিধিত্ব করে।
updated টাইমস্ট্যাম্প একটি টাইমস্ট্যাম্প একটি বস্তুর সর্বশেষ আপডেট হওয়ার সময়কে প্রতিনিধিত্ব করে।
md5Hash স্ট্রিং বস্তুর একটি MD5 হ্যাশ।
crc32c স্ট্রিং বস্তুর একটি crc32c হ্যাশ।
etag স্ট্রিং এই বস্তুর সাথে যুক্ত etag।
contentDisposition স্ট্রিং এই বস্তুর সাথে সম্পর্কিত বিষয়বস্তুর স্বভাব।
contentEncoding স্ট্রিং এই বস্তুর সাথে সম্পর্কিত বিষয়বস্তু এনকোডিং।
contentLanguage স্ট্রিং এই বস্তুর সাথে সম্পর্কিত বিষয়বস্তুর ভাষা।
contentType স্ট্রিং এই বস্তুর সাথে সম্পর্কিত বিষয়বস্তুর প্রকার।
metadata মানচিত্র<string, string> অতিরিক্ত, বিকাশকারী নির্দিষ্ট কাস্টম মেটাডেটার মূল/মান জোড়া।

request.resource generation , metageneration , etag , timeCreated , এবং updated ব্যতীত এই সবই রয়েছে।

Cloud Firestore সাথে উন্নত করুন

অনুমোদনের অন্যান্য মানদণ্ডের মূল্যায়ন করতে আপনি Cloud Firestore নথিগুলি অ্যাক্সেস করতে পারেন।

firestore.get() এবং firestore.exists() ফাংশন ব্যবহার করে, আপনার নিরাপত্তা নিয়ম Cloud Firestore নথির বিরুদ্ধে আগত অনুরোধগুলি মূল্যায়ন করতে পারে। firestore.get() এবং firestore.exists() ফাংশন উভয়ই সম্পূর্ণভাবে নির্দিষ্ট নথি পাথের প্রত্যাশা করে। firestore.get() এবং firestore.exists() এর জন্য পাথ তৈরি করার জন্য ভেরিয়েবল ব্যবহার করার সময়, আপনাকে $(variable) সিনট্যাক্স ব্যবহার করে স্পষ্টভাবে ভেরিয়েবল এড়িয়ে যেতে হবে।

নীচের উদাহরণে, আমরা একটি নিয়ম দেখতে পাই যা নির্দিষ্ট ক্লাবের সদস্য যারা ব্যবহারকারীদের ফাইল পড়ার অ্যাক্সেস সীমাবদ্ধ করে।

service firebase.storage {
  match /b/{bucket}/o {
    match /users/{club}/files/{fileId} {
      allow read: if club in
        firestore.get(/databases/(default)/documents/users/$(request.auth.id)).memberships
    }
  }
}
পরবর্তী উদাহরণে, শুধুমাত্র একজন ব্যবহারকারীর বন্ধুরা তাদের ফটো দেখতে পারে৷
service firebase.storage {
  match /b/{bucket}/o {
    match /users/{userId}/photos/{fileId} {
      allow read: if
        firestore.exists(/databases/(default)/documents/users/$(userId)/friends/$(request.auth.id))
    }
  }
}

একবার আপনি এই Cloud Firestore ফাংশনগুলি ব্যবহার করে আপনার প্রথম Cloud Storage Security Rules তৈরি এবং সংরক্ষণ করার পরে, আপনাকে দুটি পণ্য সংযোগ করার অনুমতি সক্ষম করতে Firebase কনসোল বা Firebase CLI-তে অনুরোধ করা হবে৷

আপনি একটি IAM ভূমিকা সরিয়ে বৈশিষ্ট্যটি নিষ্ক্রিয় করতে পারেন, যেমনটি Firebase Security Rules পরিচালনা এবং স্থাপনে বর্ণিত হয়েছে।

তথ্য যাচাই

Cloud Storage জন্য Firebase Security Rules ডেটা যাচাইকরণের জন্যও ব্যবহার করা যেতে পারে, যার মধ্যে ফাইলের নাম এবং পথের পাশাপাশি ফাইল মেটাডেটা বৈশিষ্ট্য যেমন contentType এবং size বৈধতা রয়েছে।

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      // Only allow uploads of any image file that's less than 5MB
      allow write: if request.resource.size < 5 * 1024 * 1024
                   && request.resource.contentType.matches('image/.*');
    }
  }
}

কাস্টম ফাংশন

যেহেতু আপনার Firebase Security Rules আরও জটিল হয়ে উঠছে, আপনি ফাংশনে শর্তগুলির সেট মোড়ানো করতে চাইতে পারেন যেগুলি আপনি আপনার রুলসেট জুড়ে পুনরায় ব্যবহার করতে পারেন। নিরাপত্তা নিয়ম কাস্টম ফাংশন সমর্থন করে। কাস্টম ফাংশনগুলির জন্য সিনট্যাক্স কিছুটা জাভাস্ক্রিপ্টের মতো, তবে Firebase Security Rules ফাংশনগুলি একটি ডোমেন-নির্দিষ্ট ভাষায় লেখা হয় যার কিছু গুরুত্বপূর্ণ সীমাবদ্ধতা রয়েছে:

  • ফাংশনে শুধুমাত্র একটি return স্টেটমেন্ট থাকতে পারে। তারা কোন অতিরিক্ত যুক্তি ধারণ করতে পারে না. উদাহরণস্বরূপ, তারা লুপ চালাতে পারে না বা বহিরাগত পরিষেবাগুলিকে কল করতে পারে না।
  • ফাংশনগুলি স্বয়ংক্রিয়ভাবে ফাংশন এবং ভেরিয়েবলগুলিকে যে সুযোগে সংজ্ঞায়িত করা হয়েছে তা থেকে অ্যাক্সেস করতে পারে। উদাহরণস্বরূপ, service firebase.storage স্কোপের মধ্যে সংজ্ঞায়িত একটি ফাংশনের resource ভেরিয়েবলে অ্যাক্সেস রয়েছে এবং শুধুমাত্র Cloud Firestore জন্য বিল্ট-ইন ফাংশন যেমন get() এবং exists()
  • ফাংশন অন্যান্য ফাংশন কল করতে পারে কিন্তু পুনরাবৃত্তি নাও হতে পারে। মোট কল স্ট্যাকের গভীরতা 10-এর মধ্যে সীমাবদ্ধ।
  • সংস্করণ rules2 এ, ফাংশন let কীওয়ার্ড ব্যবহার করে ভেরিয়েবলকে সংজ্ঞায়িত করতে পারে। ফাংশনে যেকোনো সংখ্যক লেট বাইন্ডিং থাকতে পারে, তবে অবশ্যই একটি রিটার্ন স্টেটমেন্ট দিয়ে শেষ করতে হবে।

একটি ফাংশন function কীওয়ার্ড দিয়ে সংজ্ঞায়িত করা হয় এবং শূন্য বা তার বেশি আর্গুমেন্ট নেয়। উদাহরণস্বরূপ, আপনি একটি একক ফাংশনে উপরের উদাহরণগুলিতে ব্যবহৃত দুটি ধরণের শর্ত একত্রিত করতে চাইতে পারেন:

service firebase.storage {
  match /b/{bucket}/o {
    // True if the user is signed in or the requested data is 'public'
    function signedInOrPublic() {
      return request.auth.uid != null || resource.data.visibility == 'public';
    }
    match /images/{imageId} {
      allow read, write: if signedInOrPublic();
    }
    match /mp3s/{mp3Ids} {
      allow read: if signedInOrPublic();
    }
  }
}

আপনার Firebase Security Rules ফাংশন ব্যবহার করা আপনার নিয়মের জটিলতা বাড়ার সাথে সাথে সেগুলিকে আরও রক্ষণাবেক্ষণযোগ্য করে তোলে।

পরবর্তী পদক্ষেপ

শর্তগুলির এই আলোচনার পরে, আপনি নিয়মগুলির আরও পরিশীলিত উপলব্ধি পেয়েছেন এবং এর জন্য প্রস্তুত:

মূল ব্যবহারের ক্ষেত্রে কীভাবে পরিচালনা করতে হয় তা শিখুন এবং নিয়মগুলি তৈরি, পরীক্ষা এবং স্থাপনের জন্য কর্মপ্রবাহ শিখুন: