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

cbd*_*per 6 node.js firebase service-accounts firebase-admin google-cloud-firestore

我正在构建一个云函数来获取一些文档并生成一个 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...
}
Run Code Online (Sandbox Code Playgroud)

在某些时候,我已经创建了那个 serviceAccount 键(我不记得是哪个教程中的)并且我一直在我的函数上使用它来“授予访问权” firebase-admin(如上面代码中的选项 #1)。因为我认为我需要这样做。

但我发现,即使没有任何初始化参数或 serviceAccount 凭据(如上面代码中的选项 #2),我也可以初始化firebase-admin并访问我的 firebase 项目资源(如 Firestore)而不会出现任何问题。

我可以对已部署的函数执行此操作,这是有道理的,因为它们位于 Firebase 项目的云环境中,如果已部署,它们应该可以访问项目资源,而无需服务帐户,对吗?

但我也发现我可以在我的 Node.js 本地环境中做到这一点。通过调用函数npx babel-node myFunction.js(使用 babel 节点进行编译和执行)。该函数能够毫无问题地访问和查询我的 Firestore(在线数据,这不是 Firestore 模拟器)。

我的本地环境从哪里获得访问我的项目资源的权限?它来自firebase-tools安装并登录到我的项目中的那个吗?

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

mat*_*eek 9

您可以根据环境以不同的方式初始化 SDK:

云功能

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

admin.initializeApp(functions.config().firebase);

let db = admin.firestore();
Run Code Online (Sandbox Code Playgroud)

谷歌云平台

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

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

const db = admin.firestore();
// ...
Run Code Online (Sandbox Code Playgroud)

节点服务器

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

let serviceAccount = require('path/to/serviceAccountKey.json');

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

let db = admin.firestore();
Run Code Online (Sandbox Code Playgroud)

这里了解更多详情

所以,你的观察是正确的。但是,由于即使使用 OPTION #2 您也可以访问您的 firebase,那么您很可能需要检查您的数据库规则并确保您禁止未经身份验证的访问您的数据库。

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.uid != null;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

更多关于这里的规则。

  • 使用 Firebase 工具,默认 init 不应包含任何参数才能使用默认服务帐户凭据。您现在显示的内容实际上已被弃用。所以,就是这样:`admin.initializeApp()`。没有人真的应该再使用“functions.config().firebase”。 (5认同)