امنیت اطلاعات کاربر

Firebase Security Rules برای Cloud Storage با Firebase Authentication ادغام می شود تا احراز هویت قدرتمند مبتنی بر کاربر را برای Cloud Storage فراهم کند. این امکان کنترل دسترسی گرانول را بر اساس ادعاهای یک نشانه 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");
}

خصوصی تایید شده

در موارد خاص، ممکن است بخواهید داده ها توسط همه کاربران احراز هویت شده برنامه شما قابل مشاهده باشد، اما توسط کاربران احراز هویت نشده قابل مشاهده نباشد. از آنجایی که متغیر request.auth برای همه کاربران احراز هویت نشده null است، تنها کاری که باید انجام دهید این است که وجود متغیر 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;
      }
    }
  }
}