تم رفض الإذن من Firebase باستخدام حليقة وجافا سكريبت

StackOverflow https://stackoverflow.com//questions/25034706

  •  21-12-2019
  •  | 
  •  

سؤال

لدي Firebase بتكوين أمان مثل هذا:

{
    "rules": {
        "serviceproviders": {
            ".read": "auth != null",
            ".write": "auth != null"
        },
        "bookings": {
            ".read": "auth != null",
            ".write": true,
            ".validate": "newData.hasChildren(['phone', 'time', 'date', 'apikey'])",
            "apikey": {
                // only allow valid apikey
                ".validate": "root.child('serviceproviders/' + newData.val()).exists()"
            }
        },
        "status": {
            ".read": "auth != null",
            ".write": true
        }
    }
}

والفكرة هي أنه يمكن للمستخدمين النشر فقط /bookings/ مع صالحة apikey, ، أي أن apikey التي يمكن العثور عليها في /serviceproviders/.

في محاكي Firebase، يعمل هذا كما هو متوقع.ومع ذلك، عندما أستخدم curl من المحطة، أو جافا سكريبت من صفحة HTML، أحصل على error: permission denied العودة من Firebase.أرسل نفس البيانات بالضبط (نسخ ولصق).

لي curl يبدو الأمر مثل هذا:

$ curl -X POST -d '{"phone":"004512345678", "date":"2014-07-31","time":"10:00","apikey":"AA227D80-122C-4E5D-AEDF-24A829FA6403"}'  https://example.firebaseIO.com/bookings/.json

وأعود:

{
  "error" : "Permission denied"
}
هل كانت مفيدة؟

المحلول

حسنًا، بعد عدة ساعات من شد شعري، أدركت أنه في الدليل الموجود على موقع Firebase.com، فإن ".validate" القواعد موجودة داخل كتلة تشير إلى المعرف الموجود أسفل هذا المسار، وبالتالي:

{
    "rules": {
        "serviceproviders": {
            ".read": "auth != null",
            ".write": "auth != null"
        },
        "bookings": {
            ".read": "auth != null",
            ".write": true,
            "$bookings_id": {
                "apikey": {
                    // only allow valid apikey
                    ".validate": "root.child('serviceproviders/' + newData.val()).exists()"
                },
                ".validate": "newData.hasChildren(['apikey','date','time','phone'])"
            }
        },
        "status": {
            ".read": "auth != null",
            ".write": true
        }
    }
}

يعمل كما هو متوقع، بسبب "$bookings_id" حاجز.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top