欢迎参加我们将于 2022 年 10 月 18 日举办的 Firebase 峰会(线上线下同时进行),了解 Firebase 如何帮助您加快应用开发速度、满怀信心地发布应用并在之后需要时轻松地扩大应用规模。立即报名

กฎความปลอดภัยและการตรวจสอบสิทธิ์ 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;
  }
}

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