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

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

ระบุผู้ใช้

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

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

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

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการ auth ตัวแปรโปรดดูเอกสารอ้างอิงสำหรับ ระบบคลาวด์ FireStore , เรียลไทม์ฐานข้อมูล และ การจัดเก็บเมฆ

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

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

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

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

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 ตัวแปร

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

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

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