云功能admin SDK是否需要firebase sevices.json

时间:2019-01-23 20:08:11

标签: firebase google-cloud-functions firebase-admin

我正在尝试编写一个在用户写入默认数据库时写入另一个数据库的函数, 我做了研究,有些困惑

我在firebase上看到了

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

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

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
databaseURL: 
'https://<DATABASE_NAME>.firebaseio.com'
});

还有这个

const app1 = firebase.initializeApp({
databaseURL: "https://testapp-1234-1.firebaseio.com"
});

const app2 = firebase.initializeApp({
databaseURL: "https://testapp-1234-2.firebaseio.com"
 }, 'app2');

 // Get the default database instance for an app1
 var database1 = firebase.database();

// Get a database instance for app2
var database1 = firebase.database(app2);

所以我的问题是,在使用云功能admin SDK时,我们是否需要包含密钥的service.json文件

1 个答案:

答案 0 :(得分:2)

对于几乎所有典型的用例,在Cloud Functions中使用Firebase Admin SDK时,您无需提供服务帐户。这是因为Cloud Functions为部署该功能的项目中的默认服务帐户提供了凭据。 (该帐户在Cloud控制台中可以视为App Engine默认服务帐户。)

强烈建议不使用任何参数初始化Admin SDK,并接受此默认帐户:

const admin = require('firebase-admin');
admin.initializeApp();   // accept the default service account

作为采用此默认设置的一部分,Admin SDK还将理解您默认的Realtime Database分片的URL和您默认的Cloud Storage存储桶的URL。您无需提供这些值。这样,您的代码将更易于移植到其他项目。

如果您需要访问项目的非默认资源,则还可以初始化firebase-admin的其他实例,以指向您明确配置的实例。这是您的第二个代码示例所说明的。如果您没有任何非默认资源可以访问,那么请不必理会。

如果服务帐户可以执行某些操作,则可以在Cloud控制台中授予该角色。默认情况下,此帐户当前无法执行的一项值得注意的操作是Blob的加密签名。实际上,这意味着它无法为存储在Cloud Storage中的对象生成signed URLs。在Cloud Functions中,这是很常见的事情。要解决此问题,您需要将signBlob角色授予默认服务帐户。