使用firebase-admin。服务帐户凭据有什么用途?

时间:2019-11-21 12:18:52

标签: node.js firebase google-cloud-firestore firebase-admin service-accounts

我正在构建一个云函数来获取一些文档并生成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吗?

如果我在两种情况下都不需要它们。服务帐户主要用于什么用途?

2 个答案:

答案 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的更多信息。