Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

ใช้เงื่อนไขในกฎความปลอดภัยของ Firebase Cloud Storage

คู่มือนี้จะสร้างใน การเรียนรู้ไวยากรณ์หลักของการรักษาความปลอดภัยกฎ Firebase ภาษา คู่มือจะแสดงวิธีการเพิ่มเงื่อนไขกฎ Firebase การรักษาความปลอดภัยของคุณสำหรับการจัดเก็บเมฆ

กลุ่มอาคารหลักของ Cloud Storage กฎการรักษาความปลอดภัยเป็นเงื่อนไข เงื่อนไขคือนิพจน์บูลีนที่กำหนดว่าการดำเนินการเฉพาะควรได้รับอนุญาตหรือปฏิเสธ สำหรับกฎพื้นฐานการใช้ true และ false อักษรเป็นเงื่อนไขที่ทำงาน prefectly ดี แต่ภาษา Firebase Security Rules สำหรับ Cloud Storage ช่วยให้คุณสามารถเขียนเงื่อนไขที่ซับซ้อนมากขึ้นซึ่งสามารถ:

  • ตรวจสอบการพิสูจน์ตัวตนผู้ใช้
  • ตรวจสอบข้อมูลขาเข้า

การตรวจสอบสิทธิ์

กฎความปลอดภัยของ Firebase สำหรับ Cloud Storage ผสานรวมกับการตรวจสอบสิทธิ์ของ Firebase เพื่อให้การรับรองความถูกต้องตามผู้ใช้ที่มีประสิทธิภาพไปยัง Cloud Storage ซึ่งช่วยให้สามารถควบคุมการเข้าถึงแบบละเอียดตามการอ้างสิทธิ์ของโทเค็นการตรวจสอบสิทธิ์ของ Firebase

เมื่อมีการรับรองความถูกต้องของผู้ใช้ดำเนินการร้องขอกับการจัดเก็บเมฆที่ request.auth ตัวแปรเป็นประชากรที่มีผู้ใช้ uid ( request.auth.uid ) เช่นเดียวกับการเรียกร้องของ Firebase รับรองความถูกต้อง JWT นี้ ( request.auth.token )

นอกจากนี้เมื่อใช้การตรวจสอบที่กำหนดเอง, การเรียกร้องเพิ่มเติมจะโผล่ขึ้นมาใน request.auth.token ฟิลด์

เมื่อผู้ใช้ที่ไม่ได้รับการดำเนินการคำขอที่ request.auth ตัวแปรเป็น null

เมื่อใช้ข้อมูลนี้ มีวิธีทั่วไปหลายวิธีในการใช้การตรวจสอบสิทธิ์เพื่อรักษาความปลอดภัยไฟล์:

  • สาธารณะ: ไม่สนใจ request.auth
  • รับรองความถูกต้องส่วนตัว: ตรวจสอบว่า request.auth ไม่ได้เป็น null
  • ส่วนตัว User: ตรวจสอบว่า 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 จะเป็นเพื่อให้ผู้ใช้แต่ละคนที่มีสิทธิ์ละเอียดเกี่ยวกับไฟล์ของพวกเขาจากภาพรายละเอียดการอัปโหลดไปอ่านเอกสารส่วนตัว

ตั้งแต่ไฟล์ในการจัดเก็บเมฆมีเต็ม "เส้นทาง" ไปยังไฟล์ทั้งหมดที่มันจะทำให้ไฟล์ที่ควบคุมโดยผู้ใช้เป็นชิ้นส่วนของที่ไม่ซ้ำกัน, ข้อมูลของผู้ใช้ระบุในคำนำหน้าชื่อไฟล์ (เช่นผู้ใช้ 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.uid == userId;
}

กลุ่มส่วนตัว

กรณีการใช้งานทั่วไปที่เท่าเทียมกันอีกประการหนึ่งคือการอนุญาตให้กลุ่มอนุญาตบนวัตถุ เช่น อนุญาตให้สมาชิกในทีมหลายคนทำงานร่วมกันในเอกสารที่แชร์ มีหลายวิธีในการทำเช่นนี้:

  • มิ้นท์ Firebase รับรองความถูกต้อง ที่กำหนดเองโทเค็น ที่มีข้อมูลเพิ่มเติมเกี่ยวกับสมาชิกในกลุ่ม (เช่นกลุ่ม ID)
  • รวมถึงข้อมูลกลุ่ม (เช่นรหัสกลุ่มหรือรายชื่อของผู้มีอำนาจ uid s) ใน เมตาดาต้าไฟล์

เมื่อข้อมูลนี้ถูกจัดเก็บในโทเค็นหรือข้อมูลเมตาของไฟล์ จะสามารถอ้างอิงได้จากภายในกฎ:

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

ขอการประเมินผล

อัปโหลดดาวน์โหลดการเปลี่ยนแปลงข้อมูลเมตาและลบจะมีการประเมินโดยใช้ request ส่งไปจัดเก็บเมฆ นอกเหนือไปจากรหัสเฉพาะของผู้ใช้และน้ำหนักบรรทุก Firebase รับรองความถูกต้องใน request.auth วัตถุตามที่อธิบายไว้ข้างต้น request ตัวแปรประกอบด้วยเส้นทางแฟ้มที่ร้องขอจะถูกดำเนินการเวลาเมื่อได้รับคำขอและใหม่ resource คุ้มค่าถ้า คำขอคือการเขียน รวมถึงส่วนหัว HTTP และสถานะการตรวจสอบสิทธิ์ด้วย

request วัตถุยังมีรหัสเฉพาะของผู้ใช้และน้ำหนักบรรทุก Firebase รับรองความถูกต้องใน request.auth วัตถุซึ่งจะอธิบายต่อไปใน ผู้ใช้ตามการรักษาความปลอดภัย ในส่วนของเอกสาร

รายการเต็มรูปแบบของคุณสมบัติใน request วัตถุใช้ได้ด้านล่าง:

คุณสมบัติ พิมพ์ คำอธิบาย
auth แผนที่<สตริง สตริง> เมื่อผู้ใช้เข้าสู่ระบบให้ uid ID ผู้ใช้ที่ไม่ซ้ำกันและ token แผนที่ของการเรียกร้อง Firebase รับรองความถูกต้อง JWT มิฉะนั้นก็จะเป็น null
params แผนที่<สตริง สตริง> แผนที่ที่มีพารามิเตอร์การค้นหาของคำขอ
path เส้นทาง path ที่เป็นตัวแทนของเส้นทางการร้องขอจะถูกดำเนินการที่
resource แผนที่<สตริง สตริง> มูลค่าทรัพยากรใหม่นำเสนอเฉพาะใน write คำขอ
time การประทับเวลา การประทับเวลาที่แสดงเวลาเซิร์ฟเวอร์ที่คำขอได้รับการประเมิน

การประเมินทรัพยากร

เมื่อประเมินกฎ คุณอาจต้องการประเมินข้อมูลเมตาของไฟล์ที่กำลังอัปโหลด ดาวน์โหลด แก้ไข หรือลบ วิธีนี้ช่วยให้คุณสร้างกฎที่ซับซ้อนและมีประสิทธิภาพซึ่งทำสิ่งต่างๆ เช่น อนุญาตให้อัปโหลดเฉพาะไฟล์ที่มีเนื้อหาบางประเภท หรือลบเฉพาะไฟล์ที่มีขนาดใหญ่กว่าขนาดที่กำหนด

Firebase กฎความปลอดภัยสำหรับการจัดเก็บเมฆให้เมตาดาต้าไฟล์ใน resource วัตถุซึ่งมีคู่ค่า / คีย์ข้อมูลเมตาโผล่เข้ามาในวัตถุ Cloud Storage คุณสมบัติเหล่านี้สามารถตรวจสอบเกี่ยวกับการ read หรือ write คำขอเพื่อให้มั่นใจความสมบูรณ์ของข้อมูล

เกี่ยวกับ write คำขอ (เช่นการอัปโหลดอัพเดตข้อมูลเมตาและลบ) นอกเหนือไปจาก resource วัตถุซึ่งมีเมตาดาต้าไฟล์ไฟล์ที่มีอยู่ในปัจจุบันที่เส้นทางการร้องขอคุณยังมีความสามารถในการใช้ request.resource วัตถุ ซึ่งมีชุดย่อยของข้อมูลเมตาของไฟล์ที่จะเขียนหากอนุญาตให้เขียน คุณสามารถใช้สองค่านี้เพื่อรับรองความถูกต้องของข้อมูลหรือบังคับใช้ข้อจำกัดของแอปพลิเคชัน เช่น ประเภทหรือขนาดไฟล์

รายการเต็มรูปแบบของคุณสมบัติใน resource วัตถุใช้ได้ด้านล่าง:

คุณสมบัติ พิมพ์ คำอธิบาย
name สตริง ชื่อเต็มของวัตถุ
bucket สตริง ชื่อของบัคเก็ตที่วัตถุนี้อยู่
generation int รุ่นวัตถุข้อมูล Google Cloud Storage ของวัตถุนี้
metageneration int metageneration วัตถุข้อมูล Google Cloud Storage ของวัตถุนี้
size int ขนาดของวัตถุเป็นไบต์
timeCreated การประทับเวลา การประทับเวลาแสดงเวลาที่วัตถุถูกสร้างขึ้น
updated การประทับเวลา การประทับเวลาแสดงเวลาที่วัตถุได้รับการอัปเดตครั้งล่าสุด
md5Hash สตริง แฮช MD5 ของอ็อบเจ็กต์
crc32c สตริง แฮช crc32c ของอ็อบเจ็กต์
etag สตริง etag ที่เกี่ยวข้องกับวัตถุนี้
contentDisposition สตริง การจัดการเนื้อหาที่เกี่ยวข้องกับวัตถุนี้
contentEncoding สตริง การเข้ารหัสเนื้อหาที่เกี่ยวข้องกับวัตถุนี้
contentLanguage สตริง ภาษาของเนื้อหาที่เกี่ยวข้องกับวัตถุนี้
contentType สตริง ชนิดเนื้อหาที่เกี่ยวข้องกับวัตถุนี้
metadata แผนที่<สตริง สตริง> คู่คีย์/ค่าของข้อมูลเมตาที่กำหนดเองเพิ่มเติมที่นักพัฒนาระบุ

request.resource มีทั้งหมดเหล่านี้มีข้อยกเว้นของ generation , metageneration , etag , timeCreated และ updated

ตรวจสอบข้อมูล

Firebase กฎความปลอดภัยสำหรับการจัดเก็บเมฆยังสามารถใช้สำหรับการตรวจสอบข้อมูลรวมทั้งการตรวจสอบชื่อไฟล์และเส้นทางเช่นเดียวกับคุณสมบัติของไฟล์ข้อมูลเมตาเช่น contentType และ size

service firebase.storage {
  match /b/{bucket}/o {
    match /images/{imageId} {
      // Only allow uploads of any image file that's less than 5MB
      allow write: if request.resource.size < 5 * 1024 * 1024
                   && request.resource.contentType.matches('image/.*');
    }
  }
}

ฟังก์ชั่นที่กำหนดเอง

เนื่องจากกฎความปลอดภัยของ Firebase มีความซับซ้อนมากขึ้น คุณอาจต้องการรวมชุดเงื่อนไขไว้ในฟังก์ชันที่นำมาใช้ซ้ำได้ในชุดกฎ กฎความปลอดภัยรองรับฟังก์ชันที่กำหนดเอง ไวยากรณ์สำหรับฟังก์ชันที่กำหนดเองนั้นคล้ายกับ JavaScript แต่ฟังก์ชัน Firebase Security Rules เขียนด้วยภาษาเฉพาะโดเมนซึ่งมีข้อจำกัดที่สำคัญบางประการ:

  • ฟังก์ชั่นสามารถมีเพียงคนเดียว return คำสั่ง พวกเขาไม่สามารถมีตรรกะเพิ่มเติมใด ๆ ตัวอย่างเช่น พวกเขาไม่สามารถรันลูปหรือเรียกใช้บริการภายนอกได้
  • ฟังก์ชันสามารถเข้าถึงฟังก์ชันและตัวแปรได้โดยอัตโนมัติจากขอบเขตที่กำหนดไว้ ยกตัวอย่างเช่นฟังก์ชั่นที่กำหนดไว้ภายใน service firebase.storage ขอบเขตมีการเข้าถึง resource ตัวแปรและสำหรับระบบคลาวด์ FireStore เพียงในตัวฟังก์ชั่นเช่น get() และ exists()
  • ฟังก์ชันอาจเรียกใช้ฟังก์ชันอื่นๆ แต่ไม่สามารถเรียกซ้ำได้ ความลึกของสแต็กการโทรทั้งหมดถูกจำกัดที่ 10
  • ในรุ่น rules2 ฟังก์ชั่นสามารถกำหนดตัวแปรที่ใช้ let คำหลัก ฟังก์ชันสามารถมีจำนวนการโยงแบบใดก็ได้ แต่ต้องลงท้ายด้วยคำสั่ง return

ฟังก์ชั่นที่ถูกกำหนดให้กับ function หลักและใช้อาร์กิวเมนต์ศูนย์หรือมากกว่า ตัวอย่างเช่น คุณอาจต้องการรวมเงื่อนไขสองประเภทที่ใช้ในตัวอย่างด้านบนเป็นฟังก์ชันเดียว:

service firebase.storage {
  match /b/{bucket}/o {
    // True if the user is signed in or the requested data is 'public'
    function signedInOrPublic() {
      return request.auth.uid != null || resource.data.visibility == 'public';
    }
    match /images/{imageId} {
      allow read, write: if signedInOrPublic();
    }
    match /mp3s/{mp3Ids} {
      allow read: if signedInOrPublic();
    }
  }
}

การใช้ฟังก์ชันในกฎความปลอดภัยของ Firebase ทำให้สามารถบำรุงรักษาได้มากขึ้นเมื่อกฎของคุณมีความซับซ้อนมากขึ้น

ขั้นตอนถัดไป

หลังจากการหารือเกี่ยวกับเงื่อนไขนี้ คุณมีความเข้าใจกฎเกณฑ์ที่ซับซ้อนมากขึ้นและพร้อมที่จะ:

เรียนรู้วิธีจัดการกับกรณีการใช้งานหลัก และเรียนรู้เวิร์กโฟลว์สำหรับการพัฒนา ทดสอบ และปรับใช้กฎ: