تم رفض الإذن من Firebase باستخدام حليقة وجافا سكريبت
-
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"
حاجز.
لا تنتمي إلى StackOverflow