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 กับกฎความปลอดภัยของ Firebase

ระบุผู้ใช้

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

  • uid : ID ผู้ใช้ที่ไม่ซ้ำกันซึ่งกำหนดให้กับผู้ใช้ที่ร้องขอ
  • token : แผนที่ของค่าที่รวบรวมโดย Authentication

ตัวแปร 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] มี ID ผู้ใช้ Google แรกที่เชื่อมโยงกับบัญชี
firebase.sign_in_provider ผู้ให้บริการลงชื่อเข้าใช้ใช้เพื่อรับโทเค็นนี้ สามารถเป็นหนึ่งในสตริงต่อไปนี้: custom , password , phone , anonymous , google.com , facebook.com , github.com , twitter.com
firebase.tenant tenantId ที่เชื่อมโยงกับบัญชี หากมี เช่น 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;
  }
}

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