כללי האבטחה של 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;
}
}
כדי לראות דוגמאות נוספות של כללים בסיסיים הממנפים אימות, ראה כללי אבטחה בסיסיים .