Я относительно новичок в программировании, и у меня проблемы.

У меня есть этот код для отправки данных в firebase

app.userid = app.user.uid

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

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

useridRef.set ({
  локации: "",
  тема: "",
  Цветовая схема: "",
  еда: ""
});

Однако я все время получаю ошибку:

ПРЕДУПРЕЖДЕНИЕ ПО FIREBASE: установить в / users / (GoogleID) не удалось: разрешение_denied 2016-05-23 22: 52: 42.707 firebase.js: 227 Uncaught (в обещании) Ошибка: PERMISSION_DENIED: Permission denied (…)

Когда я пытаюсь найти это, он говорит о правилах для Firebase, которые, похоже, написаны на языке, который я еще не изучил (или это просто выходит у меня из головы). Может кто-нибудь объяснить, что вызывает проблему? Я думал, что прошу сохранить адрес электронной почты и отображаемое имя пользователя, а вам просто не разрешили это делать, но когда я удалил их, у меня все еще была та же проблема. Есть ли способ избежать этой ошибки, не устанавливая правила, или правила - это то, чему я могу научить себя, как писать за день, или я просто не в своей лиге?

Спасибо за любую помощь!

Ответы (8)

По умолчанию база данных в проекте в Firebase Console доступна для чтения и записи только административным пользователям (например, в облачных функциях или процессах, использующих Admin SDK). Пользователи обычных клиентских SDK не могут получить доступ к базе данных, если вы не измените правила безопасности на стороне сервера.


Вы можете изменить правила, чтобы база данных была доступна для чтения / записи только авторизованным пользователям:

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

См. краткое руководство по правилам безопасности базы данных Firebase.

Но поскольку вы не подписываете пользователя из своего кода, база данных отказывает вам в доступе к данным. Чтобы решить эту проблему, вам нужно будет либо разрешить неаутентифицированный доступ к вашей базе данных, либо войти в систему перед доступом к базе данных.

Разрешить неаутентифицированный доступ к вашей базе данных

Самый простой обходной путь на данный момент (пока не будет обновлен учебник) - перейти в панель «База данных» в консоли вашего проекта, выбрать вкладку «Правила» и заменить содержимое следующими правилами:

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

Это делает вашу новую базу данных доступной для чтения и записи любому, кто знает URL-адрес базы данных.Не забудьте снова защитить свою базу данных перед запуском в производство, иначе кто-то может начать злоупотреблять ею.

Авторизуйтесь как пользователь перед доступом к базе данных

Для (немного) более трудоемкого, но более безопасного решения вызовите один из методов signIn ... из Firebase Authentication, чтобы убедиться, что пользователь вошел в систему. перед доступом к базе данных. Самый простой способ сделать это - с использованием анонимной аутентификации:

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.
    // ...
  }
  // ...
});

Перейти в базу, рядом с заголовком 2 варианта:

Cloud Firestore, база данных в реальном времени

Выберите базу данных в реальном времени и перейдите к правилам

Изменить правила на true.

Хорошо, но вы же не хотите открывать всю базу данных в реальном времени! Вам понадобится что-то вроде этого.

{
  /* 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"
      }
    }
  }
}

Если вы пытаетесь повторно использовать старый проект в firebase из-за ограничений бесплатного аккаунта, то правила вашей базы данных, вероятно, устарели.

В моем случае я получал ошибку 401 Unauthorized, и она была решена, когда я установил для правил чтения и записи значение true.

Спасибо за это прекрасное сообщество!

Большой респект от Бразилии!

Я столкнулся с аналогичной проблемой и обнаружил, что эта ошибка возникла из-за неправильных правил, установленных для операций чтения / записи для базы данных в реальном времени. По умолчанию Google Firebase в настоящее время загружает облачное хранилище, а не базу данных в реальном времени. Нам нужно перейти в режим реального времени и применить правильные правила.

enter image description here

Как мы видим, там говорится, что облачный Firestore не база данных в реальном времени, после переключения на правильную базу данных применяются следующие правила:

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

Другое решение - фактически создать пользователя или войти в систему автоматически, если у вас уже есть учетные данные под рукой. Вот как я это делаю с помощью 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);
        });
}

Перейдите в упомянутую вами опцию «База данных».

  1. Там, в синем заголовке, вы найдете раскрывающийся список с надписью Cloud Firestore Beta
  2. Изменить на «База данных реального времени»
  3. Перейдите в Правила и установите .write .read both в значение true

скопировано из сюда.

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

2022 WebDevInsider