قواعد الأمان ومصادقة Firebase

توفر قواعد أمان Firebase التحكم في الوصول والتحقق من صحة البيانات بتنسيق يدعم مستويات متعددة من التعقيد. لإنشاء أنظمة وصول تستند إلى المستخدم والأدوار تحافظ على أمان بيانات المستخدمين ، استخدم مصادقة Firebase مع قواعد أمان Firebase.

تحديد المستخدمين

تحدد المصادقة المستخدمين الذين يطلبون الوصول إلى بياناتك وتوفر هذه المعلومات كمتغير يمكنك الاستفادة منه في قواعدك. يحتوي متغير auth على المعلومات التالية:

  • uid : معرف مستخدم فريد يتم تعيينه للمستخدم الطالب.
  • 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] يحتوي على معرف مستخدم Google الأول المرتبط بالحساب.
firebase.sign_in_provider موفر تسجيل الدخول المستخدم للحصول على هذا الرمز المميز. يمكن أن يكون أحد السلاسل التالية: custom ، password ، phone ، anonymous ، google.com ، facebook.com ، github.com ، twitter.com .
firebase.tenant معرّف المستأجر المرتبط بالحساب ، إن وجد. على سبيل المثال tenant2-m6tyz

إذا كنت تريد إضافة سمات مصادقة مخصصة ، فإن متغير auth.token يحتوي أيضًا على أي مطالبات مخصصة تحددها.

عندما لا يتم تسجيل دخول المستخدم الذي يطلب الوصول ، يكون متغير auth null . يمكنك الاستفادة من هذا في القواعد الخاصة بك ، على سبيل المثال ، إذا كنت تريد قصر الوصول للقراءة على المستخدمين المصادق عليهم - auth != null . ومع ذلك ، نوصي عمومًا بالحد من الوصول للكتابة بشكل أكبر.

لمزيد من المعلومات حول متغير auth ، راجع الوثائق المرجعية لـ Cloud Firestore و Realtime Database و Cloud Storage .

الاستفادة من معلومات المستخدم في القواعد

من الناحية العملية ، فإن استخدام المعلومات المصادق عليها في قواعدك يجعل قواعدك أكثر قوة ومرونة. يمكنك التحكم في الوصول إلى البيانات بناءً على هوية المستخدم.

في القواعد الخاصة بك ، حدد كيف تتطابق المعلومات الموجودة في متغير auth - معلومات مستخدم الطالب - مع معلومات المستخدم المرتبطة بالبيانات المطلوبة.

على سبيل المثال ، قد يرغب تطبيقك في التأكد من أن المستخدمين يمكنهم قراءة بياناتهم الخاصة وكتابتها فقط. في هذا السيناريو ، قد ترغب في وجود تطابق بين المتغير auth.uid ومعرف المستخدم على البيانات المطلوبة:

سحابة 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 ، يمكنك إضافة حقل مخصص إلى مستندات المستخدمين واسترداد قيمة هذا الحقل بقراءة مضمنة في قواعدك. لذلك ، ستبدو القاعدة المستندة إلى المسؤول مثل المثال التالي:

سحابة 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 .

سحابة 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;
  }
}

لمشاهدة المزيد من الأمثلة على القواعد الأساسية التي تستفيد من المصادقة ، راجع قواعد الأمان الأساسية .