כללי אבטחה ואימות Firebase

כללי האבטחה של Firebase מספקים בקרת גישה ואימות נתונים בפורמט התומך ברמות מורכבות מרובות. כדי לבנות מערכות גישה מבוססות-משתמש ומבוססות תפקידים ששומרות על בטיחות הנתונים של המשתמשים שלך, השתמש באימות Firebase עם כללי אבטחה של Firebase.

זיהוי משתמשים

אימות מזהה משתמשים המבקשים גישה לנתונים שלך ומספק מידע זה כמשתנה שאתה יכול למנף בכללים שלך. משתנה auth מכיל את המידע הבא:

  • uid : מזהה משתמש ייחודי, שהוקצה למשתמש המבקש.
  • token : מפה של ערכים שנאספו על ידי אימות.

המשתנה auth.token מכיל את הערכים הבאים:

שדה תיאור
email כתובת האימייל המשויכת לחשבון, אם קיימת.
email_verified true אם המשתמש אימת שיש לו גישה לכתובת email . חלק מהספקים מאמתים באופן אוטומטי כתובות דוא"ל בבעלותם.
phone_number מספר הטלפון המשויך לחשבון, אם קיים.
name שם התצוגה של המשתמש, אם מוגדר.
sub ה-UID של Firebase של המשתמש. זה ייחודי בתוך פרויקט.
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 ה-tenantId המשויך לחשבון, אם קיים. למשל tenant2-m6tyz

אם ברצונך להוסיף תכונות אימות מותאמות אישית, המשתנה auth.token מכיל גם את כל הטענות המותאמות אישית שתציין.

כאשר המשתמש המבקש גישה אינו מחובר, משתנה auth הוא null . אתה יכול למנף את זה בכללים שלך אם, למשל, אתה רוצה להגביל גישת קריאה למשתמשים מאומתים - auth != null . עם זאת, אנו ממליצים בדרך כלל להגביל את גישת הכתיבה עוד יותר.

למידע נוסף על משתנה auth , עיין בתיעוד העיון עבור Cloud Firestore , Realtime Database ו- Cloud Storage .

נצל את מידע המשתמש בכללים

בפועל, שימוש במידע מאומת בכללים שלך הופך את הכללים שלך לחזקים וגמישים יותר. אתה יכול לשלוט בגישה לנתונים על סמך זהות המשתמש.

בכללים שלך, הגדר כיצד המידע במשתנה 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 .

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

כדי לראות דוגמאות נוספות של כללים בסיסיים הממנפים אימות, ראה כללי אבטחה בסיסיים .