Разрешение доступа на запись только к облачным функциям для Firebase

Как мы можем защитить базу данных с помощью правил, которые позволяют облачным функциям для Firebase записывать данные только в определенные места, раньше была возможность добавить uid в админ-клиент databaseAuthVariableOverride и использовать этот uid в разделе правил, но теперь мы инициализируемся через admin.initializeApp(functions.config().firebase);, поэтому я Я не уверен, как добавить дополнительные параметры.

ИЗМЕНИТЬ. Лучше ли вместо этого начать с сертификата? т.е.

admin.initializeApp({
  credential: admin.credential.cert("/path-to-cert"),
  databaseURL: "database-url",
  databaseAuthVariableOverride: { uid: "some-id" }
});

Какое преимущество admin.initializeApp(functions.config().firebase) по сравнению с вышеупомянутым и откуда functions.config() фактически получает данные, разве это не просто модуль узла?


person Ilja    schedule 22.03.2017    source источник


Ответы (1)


Обычно в верхней части кода облачных функций у вас есть:

var functions = require('firebase-functions');

Как часть модуля firebase-functions node у вас есть доступ к functions.config().firebase < / a>, который является просто объектом, который имеет все необходимое для инициализации Admin SDK, включая URL-адрес вашей базы данных и реализацию учетных данных (на основе учетных данных приложения по умолчанию). Если вы console.log(functions.config().firebase) в своем коде, вы увидите, что это просто объект с этими и некоторыми другими свойствами, которые вы, возможно, захотите использовать в своем коде.

Вы можете добавить databaseAuthVariableOverride к этому объекту в ограничить права Admin SDK. Можно просто перезаписать сам объект:

var firebaseConfig = functions.config().firebase;
firebaseConfig.databaseAuthVariableOverride = {
  uid: 'some-uid',
  foo: true,
  bar: false
};
admin.initializeApp(firebaseConfig);

Или вы можете использовать что-то вроде Object.assign() чтобы скопировать соответствующие детали в новый объект:

var firebaseConfig = Object.assign({}, functions.config().firebase, {
  databaseAuthVariableOverride: {
    uid: 'some-uid',
    foo: true,
    bar: false
  }
});
admin.initializeApp(firebaseConfig);
person jwngr    schedule 22.03.2017
comment
IIRC, порядок аргументов Object.assign() важен. В том редком случае, когда functions.config().firebase содержит свойство databaseAuthVariableOverride, оно переопределит указанное вами выше. Я бы рекомендовал использовать Object.assign({}, functions.config().firebase, { /* your overriding values */ }), чтобы все, что вы установили, оставалось окончательным. - person samthecodingman; 23.03.2017
comment
Лучше ли вместо этого инициировать администрирование с помощью сертификата настраиваемого работника службы? - person Ilja; 23.03.2017
comment
@Ilja - Можно, но это не дает преимуществ перед использованием учетных данных, указанных в functions.config().firebase. И это требует, чтобы вы управляли своим собственным файлом ключей учетной записи службы, что, как правило, является плохой практикой. @samthecodingman - Спасибо за подсказку. Я обновил свой образец кода. - person jwngr; 24.03.2017
comment
Похоже, что имя вашего проекта в firebase - это uid для ваших облачных функций. Я все еще ищу документацию для получения дополнительной информации. - person dardub; 13.04.2017
comment
У меня была путаница с облачными функциями и функциями Firebase, тогда я пытался использовать этот код в функции Firebase. Если кто-то хочет знать, как предоставить доступ на запись только функции Firebase, ответ был написан здесь stackoverflow.com/q/43642900/ 894026, стараясь указать в рамках правил запретить всем - person moonw; 27.04.2017