সুরক্ষা সংক্রান্ত নিয়ম ও Firebase Authentication

Firebase Security Rules এমন ফর্ম্যাটে অ্যাক্সেস কন্ট্রোল ও ডেটা যাচাইকরণ প্রদান করে যা একাধিক লেভেলের জটিলতা সাপোর্ট করে। ব্যবহারকারী-ভিত্তিক ও ভূমিকা-ভিত্তিক অ্যাক্সেস সিস্টেম তৈরি করতে যা আপনার ব্যবহারকারীর ডেটা সুরক্ষিত রাখে, Firebase Security Rules-এর সাথে Firebase Authentication ব্যবহার করুন।

ব্যবহারকারীদের শনাক্ত করা

Authentication আপনার ডেটা অ্যাক্সেস করার অনুরোধ করা ব্যবহারকারীদের শনাক্ত করে এবং সেই তথ্য একটি ভেরিয়েবল হিসেবে প্রদান করে যা আপনি নিজের নিয়মে ব্যবহার করতে পারবেন। auth ভেরিয়েবলে নিম্নলিখিত তথ্য থাকে:

  • uid: অনুরোধকারী ব্যবহারকারীকে অ্যাসাইন করা একটি অনন্য ব্যবহারকারী আইডি।
  • token: Authentication-এর সংগ্রহ করা ভ্যালুর ম্যাপ।

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 অ্যাকাউন্টের সাথে যুক্ত tenantId, যদি থাকে। যেমন, tenant2-m6tyz

আপনি কাস্টমাইজ করা যাচাইকরণ অ্যাট্রিবিউট যোগ করতে চাইলে, auth.token ভেরিয়েবলে আপনার উল্লেখ করা যেকোনও কাস্টম দাবি থাকে।

অ্যাক্সেসের অনুরোধ করা ব্যবহারকারী সাইন-ইন না করলে, auth ভেরিয়েবল null হয়। আপনি নিজের নিয়মে এটি ব্যবহার করতে পারেন, যেমন, আপনি যদি যাচাই করা ব্যবহারকারীদের জন্য পড়ার অ্যাক্সেস সীমিত করতে চান — auth != null। তবে, আমরা সাধারণত সাজেস্ট করি লেখার অ্যাক্সেস আরও সীমিত করতে।

auth ভেরিয়েবল সম্পর্কে আরও তথ্যের জন্য, Cloud Firestore, Realtime Database এবং Cloud Storage-এর জন্য রেফারেন্স ডকুমেন্টেশন দেখুন।

নিয়মাবলীতে ব্যবহারকারীর তথ্য ব্যবহার করা

বাস্তবে, আপনার নিয়মে যাচাই করা তথ্য ব্যবহার করলে আপনার নিয়ম আরও শক্তিশালী ও নমনীয় হয়। ব্যবহারকারীর পরিচয়ের ভিত্তিতে আপনি ডেটার অ্যাক্সেস নিয়ন্ত্রণ করতে পারবেন।

আপনার নিয়মে, auth ভেরিয়েবলে থাকা তথ্য — অনুরোধকারীর ব্যবহারকারীর তথ্য — কীভাবে অনুরোধ করা ডেটার সাথে সম্পর্কিত ব্যবহারকারীর তথ্যের সাথে মেলে তা নির্ধারণ করুন।

যেমন, আপনার অ্যাপ হয়ত নিশ্চিত করতে চায় যে ব্যবহারকারীরা শুধুমাত্র তাদের নিজস্ব ডেটা পড়তে এবং লিখতে পারবে। এই পরিস্থিতিতে, আপনি auth.uid ভেরিয়েবল এবং অনুরোধ করা ডেটায় ব্যবহারকারীর আইডির মধ্যে মিল চাইবেন:

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure the uid of the requesting user matches name of the user
    // document. The wildcard expression {userId} makes the userId variable
    // available in rules.
    match /users/{userId} {
      allow read, write: if request.auth != null && request.auth.uid == userId;
    }
  }
}

Realtime Database

{
  "rules": {
    "users": {
      "$userId": {
        // grants write access to the owner of this user account
        // whose uid must exactly match the key ($userId)
        ".write": "$userId === auth.uid"
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  // Only a user can upload their file, but anyone can view it
  match /users/{userId}/{fileName} {
    allow read;
    allow write: if request.auth != null && request.auth.uid == userId;
  }
}

কাস্টম ব্যবহারকারীর তথ্য সংজ্ঞায়িত করুন

আপনার অ্যাপের ব্যবহারকারীদের জন্য অ্যাসাইন করা কাস্টম ফিল্ড নির্ধারণ করতে, আপনি auth ভেরিয়েবল আরও বেশি করে ব্যবহার করতে পারবেন।

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

Cloud Firestore-এ, আপনি ব্যবহারকারীর ডকুমেন্টে কাস্টম ফিল্ড যোগ করতে এবং আপনার নিয়মে এম্বেড করা রিডের মাধ্যমে সেই ফিল্ডের ভ্যালু ফিরিয়ে আনতে পারবেন। তাই, আপনার অ্যাডমিন-ভিত্তিক নিয়ম নিম্নলিখিত উদাহরণের মতো দেখতে হবে:

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents/some_collection: {
    // Remember that, in Cloud Firestore, reads embedded in your rules are billed operations
    write: if request.auth != null && get(/databases/(database)/documents/users/$(request.auth.uid)).data.admin == true;
    read: if request.auth != null;
  }
}

Authentication-এ কাস্টম দাবি তৈরি করার পরে আপনি Security Rules-এ কাস্টম দাবি অ্যাক্সেস করতে পারবেন। তারপর আপনি auth.token ভেরিয়েবল ব্যবহার করে সেইসব কাস্টম দাবি রেফারেন্স করতে পারবেন।

Cloud Firestore

service cloud.firestore {
  match /databases/{database}/documents {
    // For attribute-based access control, check for an admin claim
    allow write: if request.auth.token.admin == true;
    allow read: true;

    // Alterntatively, for role-based access, assign specific roles to users
    match /some_collection/{document} {
     allow read: if request.auth.token.reader == "true";
     allow write: if request.auth.token.writer == "true";
   }
  }
}

Realtime Database

{
  "rules": {
    "some_path": {
      "$sub_path": {
      // Create a custom claim for the admin role
      ".write": "auth.uid !== null && auth.token.writer === true",
      ".read": "auth.uid !== null"
      }
    }
  }
}

Cloud Storage

service firebase.storage {
  // Create a custom claim for the admin role
  match /files/{fileName} {
    allow read: if request.auth.uid != null;
    allow write: if request.auth.token.admin == true;
  }
}

Security Rules-এর Authentication-এর সুবিধা নেওয়ার আরও উদাহরণ দেখতে, প্রাথমিক নিরাপত্তা সংক্রান্ত নিয়ম দেখুন।