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

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

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

احراز هویت کاربرانی را که درخواست دسترسی به داده‌های شما را دارند شناسایی می‌کند و آن اطلاعات را به عنوان متغیری که می‌توانید در قوانین خود اعمال کنید، ارائه می‌کند. متغیر 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 .

اگر می‌خواهید ویژگی‌های احراز هویت سفارشی‌شده را اضافه کنید، متغیر auth.token همچنین حاوی هر ادعای سفارشی است که شما مشخص می‌کنید.

زمانی که کاربر درخواست کننده دسترسی وارد نشده باشد، متغیر auth null است. برای مثال اگر بخواهید دسترسی خواندن را به کاربران احراز هویت شده محدود کنید، می توانید از این در قوانین خود استفاده کنید - auth != null . با این حال، ما به طور کلی توصیه می کنیم دسترسی به نوشتن را بیشتر محدود کنید.

برای اطلاعات بیشتر در مورد متغیر auth ، به مستندات مرجع برای Cloud Firestore ، پایگاه داده بیدرنگ ، و 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;
    }
  }
}

پایگاه داده بیدرنگ

{
  "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"
      }
    }
  }
}

فضای ذخیره ابری

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;
  }
}

برای Rules in Realtime Database و Cloud Storage، ادعاهای سفارشی را در Authentication ایجاد کنید . سپس می توانید با استفاده از متغیر auth.token به آن ادعاهای سفارشی ارجاع دهید.

پایگاه داده بیدرنگ

{
  "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"
      }
    }
  }

فضای ذخیره ابری

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;
  }
}

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