قوانین امنیتی و احراز هویت Firebase

Firebase Security Rules کنترل دسترسی و اعتبارسنجی داده ها را در قالبی ارائه می کند که از سطوح مختلف پیچیدگی پشتیبانی می کند. برای ساختن سیستم‌های دسترسی مبتنی بر کاربر و نقش‌محور که داده‌های کاربران شما را ایمن نگه می‌دارد، Firebase Authentication با Firebase Security Rules استفاده کنید.

شناسایی کاربران

Authentication کاربرانی را که درخواست دسترسی به داده‌های شما را دارند شناسایی می‌کند و این اطلاعات را به عنوان متغیری که می‌توانید در قوانین خود اعمال کنید، ارائه می‌کند. متغیر auth حاوی اطلاعات زیر است:

  • uid : یک شناسه کاربری منحصر به فرد که به کاربر درخواست کننده اختصاص داده می شود.
  • token : نقشه ای از مقادیر جمع آوری شده توسط Authentication .

متغیر auth.token حاوی مقادیر زیر است:

میدان توضیحات
email آدرس ایمیل مرتبط با حساب، در صورت وجود.
email_verified true اگر کاربر تأیید کرده باشد که به آدرس email دسترسی دارد. برخی از ارائه دهندگان به طور خودکار آدرس های ایمیل خود را تأیید می کنند.
phone_number شماره تلفن مرتبط با حساب، در صورت وجود.
name نام نمایشی کاربر، در صورت تنظیم.
sub UID Firebase کاربر. این در یک پروژه منحصر به فرد است.
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

اگر می‌خواهید ویژگی‌های احراز هویت سفارشی شده را اضافه کنید، متغیر 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 ، می‌توانید به ادعاهای سفارشی در 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;
  }
}

برای مشاهده نمونه‌های بیشتر Rules اساسی که از Authentication استفاده می‌کنند، به قوانین اساسی امنیت مراجعه کنید.