Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

กฎความปลอดภัยและการตรวจสอบสิทธิ์ Firebase

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

กฎความปลอดภัยของ Firebase ให้การควบคุมการเข้าถึงและการตรวจสอบข้อมูลในรูปแบบที่รองรับความซับซ้อนหลายระดับ หากต้องการสร้างระบบการเข้าถึงตามผู้ใช้และตามบทบาทที่จะรักษาข้อมูลของผู้ใช้ให้ปลอดภัย ให้ใช้ Firebase Authentication กับ Firebase Security Rules

ระบุผู้ใช้

การตรวจสอบสิทธิ์จะระบุผู้ใช้ที่ร้องขอการเข้าถึงข้อมูลของคุณและให้ข้อมูลนั้นเป็นตัวแปรที่คุณสามารถใช้ประโยชน์จากกฎของคุณได้ ตัวแปร auth ประกอบด้วยข้อมูลต่อไปนี้:

  • uid : ID ผู้ใช้เฉพาะที่กำหนดให้กับผู้ใช้ที่ร้องขอ
  • token : แผนที่ของค่าที่รวบรวมโดยการรับรองความถูกต้อง

ตัวแปร 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 รหัสผู้เช่าที่เชื่อมโยงกับบัญชี ถ้ามี เช่น tenant2-m6tyz

หากคุณต้องการเพิ่มแอตทริบิวต์การตรวจสอบสิทธิ์ที่กำหนดเอง ตัวแปร auth.token จะประกอบด้วยการ อ้างสิทธิ์ที่กำหนดเองที่ คุณระบุด้วย

เมื่อผู้ใช้ที่ร้องขอการเข้าถึงไม่ได้ลงชื่อเข้าใช้ ตัวแปร auth ความถูกต้องจะเป็น null คุณสามารถใช้ประโยชน์จากสิ่งนี้ในกฎของคุณ ตัวอย่างเช่น คุณต้องการจำกัดการเข้าถึงการอ่านสำหรับผู้ใช้ที่รับรองความถูกต้อง — auth != null อย่างไรก็ตาม โดยทั่วไป เราแนะนำให้จำกัดการเข้าถึงการเขียนเพิ่มเติม

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวแปร auth ความถูกต้อง โปรดดูเอกสารอ้างอิงสำหรับ Cloud Firestore , Realtime Database และ Cloud Storage

ใช้ประโยชน์จากข้อมูลผู้ใช้ในกฎ

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

ในกฎของคุณ กำหนดวิธีการที่ข้อมูลในตัวแปร auth ความถูกต้อง - ข้อมูลผู้ใช้ของผู้ร้องขอ - ตรงกับข้อมูลผู้ใช้ที่เกี่ยวข้องกับข้อมูลที่ร้องขอ

ตัวอย่างเช่น แอปของคุณอาจต้องการตรวจสอบให้แน่ใจว่าผู้ใช้สามารถอ่านและเขียนข้อมูลของตนเองได้เท่านั้น ในสถานการณ์สมมตินี้ คุณต้องการจับคู่ระหว่างตัวแปร auth.uid และ ID ผู้ใช้ในข้อมูลที่ร้องขอ:

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

คุณสามารถเข้าถึงการอ้างสิทธิ์แบบกำหนดเองได้ในกฎหลังจาก สร้างการอ้างสิทธิ์แบบกำหนดเอง ในการรับรองความถูกต้อง จากนั้น คุณสามารถอ้างอิงการอ้างสิทธิ์แบบกำหนดเองเหล่านั้นได้โดยใช้ตัวแปร 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";
   }
  }
}

ฐานข้อมูลเรียลไทม์

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

หากต้องการดูตัวอย่างเพิ่มเติมของกฎพื้นฐานที่ใช้การรับรองความถูกต้อง โปรดดู กฎความปลอดภัยพื้นฐาน