قواعد الأمان ومصادقة 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 ومعرف المستخدم على البيانات المطلوبة:

سحابة فايرستور

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

سحابة فايرستور

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 .

سحابة فايرستور

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

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