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

Я пытаюсь настроить облачную функцию, которая при запуске Cloud Scheduler будет вставлять определенные данные в мою базу данных Firestore. Я делаю это в Node.js, используя встроенный редактор, предоставленный при создании моей облачной функции.

Я получаю сообщение об ошибке:

"Ошибка: сбой функции. Детали: 7 PERMISSION_DENIED: отсутствует или недостаточно разрешений. "

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

index.js:

const Firestore = require('@google-cloud/firestore');
const PROJECTID = 'MY_PROJECT_ID';
const firestore = new Firestore({
  projectId: PROJECTID,
  timestampsInSnapshots: true,
});

/**
 * Responds to any HTTP request.
 *
 * @param {!express:Request} req HTTP request context.
 * @param {!express:Response} res HTTP response context.
 */
exports.helloWorld = (req, res) => {
    return firestore.collection("users").add({
    first: "Ada",
    last: "Lovelace",
    born: 1815
    });
};

Package.json:

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "@google-cloud/firestore": "0.17.0",
    "semver": "^5.5.1"
  }
}

У меня также есть правила для моей базы данных:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
        allow read, write;
    }
  }
}

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Благодаря @andresmijares я смог решить мою проблему. Я больше посмотрел на quickstart и изменил свой index.js следующим образом (особенно все до функции helloWorld).

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

admin.initializeApp({
  credential: admin.credential.applicationDefault()
});

const db = admin.firestore();

/**
 * Responds to any HTTP request.
 *
 * @param {!express:Request} req HTTP request context.
 * @param {!express:Response} res HTTP response context.
 */
exports.helloWorld = (req, res) => {
/*  let message = req.query.message || req.body.message || 'Hello World!';
  res.status(200).send(message);
  */
    return db.collection("users").add({
    first: "Ada",
    last: "Lovelace",
    born: 1815
    });
};

И я получил ошибку

"Код в файле index.js не может быть загружен. Вы перечислили все необходимые модули в зависимостях package.json? Подробная трассировка стека: Ошибка: Не удается найти модуль 'firebase-admin'"

Что я смог исправить, добавив зависимость «firebase-admin» в мой package.json следующим образом:

{
  "name": "sample-http",
  "version": "0.0.1",
    "dependencies": {
    "semver": "^5.5.1",
    "@google-cloud/firestore": "^1.3.0",
    "firebase-admin": "^7.1.1"
  }
}

Все это также было сделано в встроенном редакторе, предоставленном при создании моей облачной функции, поэтому установка чего-либо не требовалась.

0 голосов
/ 19 июня 2019

вам нужно скачать ключ sdk, это json-файл, который вы можете экспортировать из вашей консоли Firebase Project Overview -> Project Settings -> Services Accounts

Затем вы можете создать его экземпляр следующим образом:

var admin = require("firebase-admin");

var serviceAccount = require("path/to/serviceAccountKey.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

При использовании firebase admin sdk правила безопасности firestore не применяются (они предназначены только для операций на стороне клиента)

...