在将Cloud Firestore用作数据后端时,我需要与非技术站点经理(编辑,销售团队等)共享一些数据集合。另外,我希望这些人可以编辑存储在Cloud Firestore中的数据。
Google表格是站点管理员非常熟悉的工具,可以节省我开发CRUD管理面板的时间,例如从头开始的界面,用于数据更新和查看。
此堆栈溢出answer显示了如何使用云功能和深度级别发送数据,并且该Github library可以使用Google Apps脚本从Firestore获取数据(我希望使用Cloud Functions或Firebase Admin SDK),但我仍在尝试弄清楚如何制作基于端到端工作表的界面。
请指导是否有更好的选择来实现相同的目标。从SQL数据库和Django自动创建的管理界面切换到Firebase-Firestore NoSQL世界时,我遇到了一些困难。
答案 0 :(得分:1)
我了解您希望能够从Google表格调用云功能,以便为Firestore构建“基于端到端基于表格的界面”。
您可以使用UrlFetchApp类发出请求以获取HTTP Cloud Function的URL。
您的Apps脚本代码如下:
function callSimpleHTTPCloudFunction() {
const url = "https://xxxxxxxx.cloudfunctions.net/simpleHttp";
response = UrlFetchApp.fetch(url, {
method: 'get'
})
respObj = JSON.parse(response.getContentText());
Logger.log(respObj);
}
您的云功能如下:
exports.simpleHttp = functions.https.onRequest((req, res) => {
res.send({ msg: 'simpleHttp' });
});
这是Cloud Function的一个非常简单的示例,但是您可以调整此Cloud Function以从Firestore读取数据或向Firestore写入数据。观看以下官方视频作为起点:https://www.youtube.com/watch?v=7IkUgCLr5oA&t=1s&list=PLl-K7zZEsYLkPZHe41m4jfAxUi0JjLgSM&index=3
现在,如果您想以一种可以对谁可以通过Cloud Function访问数据进行控制的方式对用户进行身份验证,则它将变得更加复杂。
有一个官方的Cloud Function示例,其中显示了“如何将HTTPS功能仅限制为您应用的Firebase用户”:https://github.com/firebase/functions-samples/tree/master/authorized-https-endpoint
如代码注释中所述:“ Firebase ID令牌需要作为承载令牌传递给Authorization HTTP标头,如下所示:Authorization: Bearer <Firebase ID Token>
。成功解码后,ID令牌内容将添加为{ {1}}。”
因此,您需要在您的Apps脚本代码中为Firebase用户生成一个Firebase ID令牌。为此,我们将使用Firebase Auth REST API。在此示例中,我们将使用在Google表格(req.user
)中经过身份验证的用户的电子邮件作为Firebase用户名。
如文档中所述,要调用Firebase Auth REST API,您需要通过Firebase管理控制台中的项目设置页面获取Firebase项目的Web API密钥。
以下Apps脚本功能将完成此工作:
Session.getActiveUser().getEmail()
然后,仍在Apps脚本中,在对Cloud Function的调用中使用令牌,如下所示:
function getToken() { {
const userName = Session.getActiveUser().getEmail();
const pwd = 'xyz' //For example get the password via a prompt.
//This is NOT the password of the account authenticated with Google Sheet, but the password of the Firebase user. In this example, the emails are the same but they are different accounts.
const verifyPasswordUrl = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key=[API_KEY]" //Replace with your Web API Key
const payload = JSON.stringify({"email":userName,"password": pwd,"returnSecureToken": true});
const verifyPasswordResponse = UrlFetchApp.fetch(verifyPasswordUrl, {
method: 'post',
contentType: 'application/json',
muteHttpExceptions: true,
payload : payload
});
const token = JSON.parse(verifyPasswordResponse.getContentText()).idToken;
return token;
}
根据官方示例改编的Cloud Function代码如下。
function callSecuredHTTPCloudFunction() {
const authHeader = {"Authorization": "Bearer " + getToken()};
const url = "https://us-central1-<yourproject>.cloudfunctions.net/securedHttp/";
const response = UrlFetchApp.fetch(url, {
method: 'get',
headers: authHeader,
muteHttpExceptions: true,
});
Logger.log(response);
//Here do what you want with the response from the Cloud Function, e.g. populate the Sheet
}
您可以很好地编写具有POST和有效负载的类似功能,以便将数据从Google表格发送到Cloud Function,然后写入Firestore。
最后,请注意,您可以采用相同的方法从Google表格中调用Firestore REST API而不是调用Cloud Functions。