我正在构建一个云函数来获取一些文档并生成HTML响应。
现在我所拥有的是:
myFunction.js
import * as admin from 'firebase-admin';
import serviceAccount from './someServiceAccountKey.json';
// OPTION #1 <-----
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
databaseURL: "https://myfirebaseproject.firebaseio.com"
});
// OPTION #2 <------
admin.initializeApp();
// FUNCTION <------
async function(req,res) {
const docSnapshot = await admin.firestore().collection('someCollection').doc('someDoc').get();
// AND SO ON...
}
在某个时候,我已经创建了那个serviceAccount密钥(我不记得从哪个教程开始),并且我一直在使用自己的函数来“授予对firebase-admin
的访问权限(如以上代码中的选项#1 )。因为我认为我需要这样做。
但是我发现,即使没有任何初始化参数或serviceAccount凭据(如上述代码中的 OPTION#2 ),我也可以初始化firebase-admin
并访问我的Firebase项目资源(如Firestore)没有任何问题。
我可以对已部署的功能执行此操作,这很有意义,因为它们位于Firebase项目的云环境中,并且如果已部署,则它们应该可以访问项目的资源,而无需服务帐户,对?
但是我还发现我可以在Node.js本地环境中执行此操作。通过使用npx babel-node myFunction.js
调用函数(使用babel节点进行编译和执行)。该功能可以访问和查询我的Firestore(在线数据,这不是Firestore模拟器),没有任何问题。
我的本地环境在哪里获得访问我项目资源的权限?是来自安装并登录到我的项目中的firebase-tools
吗?
如果我在两种情况下都不需要它们。服务帐户主要用于什么用途?
答案 0 :(得分:1)
Firebase数据使用规则进行保护,在设置任何规则之前,任何用户(甚至未经身份验证的用户)都可以访问您的数据。
https://firebase.google.com/docs/rules/basics
一旦设置了规则,则用户或服务器将必须进行身份验证才能读取/写入数据。
用户通过使用google(或您指定的任何客户端安全性)登录进行身份验证。
服务器使用服务帐户进行身份验证。服务帐户默认为具有对数据库的管理员访问权限。
https://firebase.google.com/docs/database/admin/start#authenticate-with-admin-privileges
答案 1 :(得分:1)
您可以根据环境以不同的方式初始化SDK:
云功能
const admin = require('firebase-admin');
const functions = require('firebase-functions');
admin.initializeApp(functions.config().firebase);
let db = admin.firestore();
Google Cloud Platform
const admin = require('firebase-admin');
admin.initializeApp({
credential: admin.credential.applicationDefault()
});
const db = admin.firestore();
// ...
节点服务器
const admin = require('firebase-admin');
let serviceAccount = require('path/to/serviceAccountKey.json');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
});
let db = admin.firestore();
查看here了解更多详情
因此,您的观察是正确的。 但是,由于即使使用OPTION#2,您也可以访问Firebase,因此最有可能,您需要检查数据库规则,并确保禁止未经授权的数据库访问。
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.uid != null;
}
}
}
有关规则here的更多信息。