Дозвіл пожежної бази відхилено


123

Я відносно новий в кодуванні і маю проблеми.

У мене є цей код для надсилання даних у firebase

app.userid = app.user.uid

var userRef = app.dataInfo.child(app.users);

var useridRef = userRef.child(app.userid);

useridRef.set({
  locations: "",
  theme: "",
  colorScheme: "",
  food: ""
});

Однак я продовжую отримувати помилку:

ПОПЕРЕДЖЕННЯ ПОЖАРУ: встановлено в / users / (GoogleID) не вдалося: посилання_захищено 2016-05-23 22: 52: 42.707 firebase.js: 227 Не знайдено (в обіцянні) Помилка: PERMISSION_DENIED: Дозвіл відхилено (…)

Коли я намагаюся розглянути це, це говорить про правила для Firebase, що, здається, є мовою, якої я ще не вивчив (або це просто переходить через голову). Чи може хтось пояснити, що викликає проблему? Я подумав, що я просив, щоб він зберігав електронну пошту та відображувальне ім’я користувача, і вам просто не дозволяли цього робити, але коли я вийняв їх, у мене все-таки була така ж проблема. Чи є спосіб уникнути цієї помилки без встановлення правил, чи це правила, чогось я можу навчити себе писати за день, або я просто виходжу зі своєї ліги?

Дякуємо за будь-яку допомогу!

Відповіді:


250

За замовчуванням база даних у проекті в консолі Firebase читається / записується лише адміністративними користувачами (наприклад, у хмарних функціях або процесах, що використовують SDK адміністратора). Користувачі звичайних клієнтських SDK не можуть отримати доступ до бази даних, якщо ви не зміните правила безпеки на сервері.


Ви можете змінити правила, щоб базу даних читали / записували лише автентифіковані користувачі:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

Див. Швидкий старт для правил безпеки бази даних Firebase .

Але оскільки ви не підписуєте користувача зі свого коду, база даних забороняє вам доступ до даних. Щоб вирішити це, вам потрібно буде дозволити несанкціонований доступ до вашої бази даних або увійти в систему перед тим, як отримати доступ до бази даних.

Дозволити неавторизований доступ до вашої бази даних

Найпростішим рішенням на даний момент (поки оновлення не буде оновлено) є зайти на панель "База даних" в консолі проекту, виберіть вкладку "Правила" та замінити вміст цими правилами:

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

Це робить вашу нову базу даних доступною для читання та написання всім, хто знає URL-адресу бази даних. Будьте впевнені, щоб знову захистити свою базу даних перед тим, як перейти до виробництва, інакше хтось, ймовірно, почне зловживати нею.

Увійдіть до користувача, перш ніж отримати доступ до бази даних

Для (трохи) більш трудомісткого, але більш безпечного рішення, зателефонуйте до одного із signIn...методів аутентифікації Firebase, щоб переконатися, що користувач увійшов до доступу до бази даних. Найпростіший спосіб зробити це за допомогою анонімної автентифікації :

firebase.auth().signInAnonymously().catch(function(error) {
  // Handle Errors here.
  var errorCode = error.code;
  var errorMessage = error.message;
  // ...
});

А потім підключіть своїх слухачів, коли буде виявлено вхід

firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
    var isAnonymous = user.isAnonymous;
    var uid = user.uid;
    var userRef = app.dataInfo.child(app.users);

    var useridRef = userRef.child(app.userid);

    useridRef.set({
      locations: "",
      theme: "",
      colorScheme: "",
      food: ""
    });

  } else {
    // User is signed out.
    // ...
  }
  // ...
});

1
Дякую - використав невпевнене виправлення та цитував свою відповідь у відповіді на аналогічне запитання щодо просування минулих проблем дозволу Firebase у цьому підручнику Ембер . Але куди ми додамо (захищений) анонімний код автентичності?
Дейв Еверітт

2
OMG туди йде годину. У мене це було, але значення були НЕВЕРСЬКІ ... Я просто пропустив це. Змінив їх на ІСТИНА та бам, додаток працює так, як ти думаєш ...
Енді

OMG, я також не міг зрозуміти, чому вони не мають дозволів, коли вони обидва вже встановлені на помилкові (доки я не прочитав ваш коментар). Так, помилка noob. Вони повинні бути правдивими, коли ви робите це відкритим для публіки (читає). Дякуємо, що вказали на власну помилку, ви допомогли мені це зрозуміти. Для запису я змінив своє правило на таке: ".read": true і тоді воно почало працювати.
підрядник-

@Andy Дякую, чоловіче, мені так само і побачивши ваш коментар просто вирішив мою
проблему

86

Я зіткнувся з подібною проблемою і з'ясував, що ця помилка була пов'язана з неправильними правилами, встановленими для операцій читання / запису в базі даних в режимі реального часу. За замовчуванням Firefox Firefox сьогодні завантажує хмарний магазин, а не базу даних у режимі реального часу. Нам потрібно перейти на реальний час і застосувати правильні правила.

введіть тут опис зображення

Як ми бачимо, він говорить, що хмара Firestore не є базами даних у режимі реального часу, після переключення на правильну базу даних застосовуються нижче правила:

{
   "rules": {
       ".read": true,
       ".write": true
     }
 }

3
Чорт користувальницький! Я провів цілий день, з'ясовуючи, чому я маю різні правила ... А-а ... Це було для "хмарного вогню" ... Дякую!
Олексій

43

Перейдіть до згаданого вами варіанту "База даних".

  1. Там на Blue Header ви знайдете спадне меню, де написано Beta Cloud Firestore
  2. Змініть його на "База даних у реальному часі"
  3. Перейдіть до Правил і встановіть .write. Читайте обидва в true

Скопійовано звідси .


11

Перейдіть до бази даних, поруч із заголовком є ​​2 варіанти:

Cloud Firestore, база даних в реальному часі

Виберіть базу даних у реальному часі та перейдіть до правил

змінити правила на справжні.

Це вирішило мою проблему.


4
  1. Відкрийте Firebase, виберіть базу даних ліворуч.
  2. Тепер праворуч виберіть зі спадного меню пункт [База даних в реальному часі] та змініть правила на: {"правила": {".read": true, ".write": true}}

це працює..!!


5
Про це вже сказано в іншій відповіді. Крім того, коли ви пропонуєте це, обов'язково додайте попередження, оскільки це не рятує!
Андре Кул

4

Гаразд, але ви не хочете відкривати всю базу даних у реальному часі! Вам потрібно щось подібне.

{
  /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
  "rules": {
    ".read": "auth.uid !=null",
    ".write": "auth.uid !=null"
  }
}

або

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

2

Ще одне рішення - це фактично створити або авторизувати користувача автоматично, якщо у вас вже є облікові дані. Ось як я це роблю за допомогою Plain JS.

function loginToFirebase(callback)
{
    let email = 'xx@xx.com';
    let password = 'xxxxxxxxxxxxxx';
    let config =
    {
        apiKey: "xxx",
        authDomain: "xxxxx.firebaseapp.com",
        projectId: "xxx-xxx",
        databaseURL: "https://xxx-xxx.firebaseio.com",
        storageBucket: "gs://xx-xx.appspot.com",
    };

    if (!firebase.apps.length)
    {
        firebase.initializeApp(config);
    }

    let database = firebase.database();
    let storage = firebase.storage();

    loginFirebaseUser(email, password, callback);
}

function loginFirebaseUser(email, password, callback)
{
    console.log('Logging in Firebase User');

    firebase.auth().signInWithEmailAndPassword(email, password)
        .then(function ()
        {
            if (callback)
            {
                callback();
            }
        })
        .catch(function(login_error)
        {
            let loginErrorCode = login_error.code;
            let loginErrorMessage = login_error.message;

            console.log(loginErrorCode);
            console.log(loginErrorMessage);

            if (loginErrorCode === 'auth/user-not-found')
            {
                createFirebaseUser(email, password, callback)
            }
        });
}

function createFirebaseUser(email, password, callback)
{
    console.log('Creating Firebase User');

    firebase.auth().createUserWithEmailAndPassword(email, password)
        .then(function ()
        {
            if (callback)
            {
                callback();
            }
        })
        .catch(function(create_error)
        {
            let createErrorCode = create_error.code;
            let createErrorMessage = create_error.message;

            console.log(createErrorCode);
            console.log(createErrorMessage);
        });
}

Це дійсно погана безпека.
ASH
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.