ব্যবহারকারীর ডেটা সুরক্ষিত করুন

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 != null && 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;
}

সম্পূর্ণ উদাহরণ

চারটি সাধারণ ধরনের প্রমাণীকরণ সীমাবদ্ধতার সহজ ক্ষেত্রে নীচের উদাহরণে দেখানো হয়েছে:

service firebase.storage {
  match /b/{bucket}/o {
    match /images {
      // Anyone can view any image (no auth, publicly readable)
      match /{allImages=**} {
        allow read;
      }

      // Only authenticated users can write to "public" images
      match /public/{imageId} {
        allow write: if request.auth != null;
      }

      // Only an individual user can write to "their" images
      match /{userId}/{imageId} {
        allow write: if request.auth.uid == userId;
      }

      // Allow a "group" of users to read/write to shared images
      // An owner metadata property on the object contains the groupId for reads
      // A custom token has been minted with a groupId property for writes
      match /{groupId}/{imageId} {
        allow read: if resource.metadata.owner == request.auth.token.groupId;
        allow write: if request.auth.token.groupId == groupId;
      }
    }
  }
}