Отсутствуют разрешения при отправке данных из облачных функций в Firestore после определенного периода времени после развертывания - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть некоторые проблемы с разрешениями для Firestore / Firebase, как при отправке данных из формы веб-сайта, так и из Google Cloud Functions. Я временно исправил это, я полагаю, установив переменную окружения GOOGLE_APPLICATION_CREDENTIALS для моего ключа учетной записи службы Google перед повторным развертыванием в Firebase. Проблема остановилась на несколько часов и вернулась снова, хотя я не внес никаких изменений за это время. Есть идеи, почему это может быть так?

Я снова развернул после установки переменной среды GOOGLE_APPLICATION_CREDENTIALS еще раз, и проблема снова исчезла.

ПРИМЕЧАНИЕ. Я не зацикливаюсь на своих учетных записях служб. У меня их несколько - один с ключом.

Вот сообщения об ошибках, которые у меня были раньше.

На консоли браузера :

Отсутствует или недостаточно прав

В журналах функций Google Cloud :

Ошибка записи документа: Ошибка: не удалось загрузить учетные данные по умолчанию.


РЕДАКТИРОВАТЬ:

Проблема возникла примерно через полчаса после исправления, но на этот раз только при отправке данных из Google Cloud Functions. Я снова развернул (с установленной переменной среды ключа учетной записи службы), и это было решено. Я полагаю, у меня нет правильной служебной учетной записи для функций / Admin SDK?

Нужно ли добавлять разрешения для моих учетных записей служб? Возможно, они назвали что-то firebase-adminsdk (2 из них) или «Учетная запись службы App Engine по умолчанию»?

Мой код :

const admin = require('firebase-admin');  

exports.helloPubSub = functions.pubsub.topic('my-topic').onPublish((message) => {

  // Get the `temp` attribute of the PubSub message JSON body.
  let temp = null;
  let humid = null;
  try {
    temp = message.json.temp;
    humid = message.json.humid;
  } catch (e) {
    console.error('PubSub message was not JSON or does not inlcude this variable', e);
  }

  // Get the `published_at` attribute of the PubSub message JSON body.
  let datetime = null;
  try {
    datetime = message.attributes.published_at;
  } catch (e) {
    console.error('PubSub message does not contain this attribute', e);
  }

  if (!admin.apps.length) { //Checking if the app has already been initialised, to avoid error
    admin.initializeApp(functions.config().firebase);
  }

  const db = admin.firestore();

  if (temp !== null && temp !== undefined) {
    db.collection("data").add({
      temp: temp,
      humid: humid,
      datetime: datetime,
    })
      .then(function () {
        console.log("Temp and humid document was successfully written!");
        return null;
      })
      .catch(function (error) {
        console.error("Error writing document: ", error);
      });

  }

  return true;
});
...