Firebase云函数-createCustomToken

Firebase云函数-createCustomToken,firebase,google-cloud-platform,google-cloud-functions,Firebase,Google Cloud Platform,Google Cloud Functions,将新的Firebase云函数与admin sdk结合使用 我想使用admin.auth().createCustomToken()函数。调用此函数将导致错误消息 Error: createCustomToken() requires a certificate with "private_key" set. at FirebaseAuthError.Error (native) at FirebaseAuthError.FirebaseError [as constructor]

将新的Firebase云函数与admin sdk结合使用

我想使用admin.auth().createCustomToken()函数。调用此函数将导致错误消息

Error: createCustomToken() requires a certificate with "private_key" set.
    at FirebaseAuthError.Error (native)
    at FirebaseAuthError.FirebaseError [as constructor] (/user_code/node_modules/firebase-admin/lib/utils/error.js:25:28)
    at new FirebaseAuthError (/user_code/node_modules/firebase-admin/lib/utils/error.js:90:23)
    at FirebaseTokenGenerator.createCustomToken (/user_code/node_modules/firebase-admin/lib/auth/token-generator.js:62:19)
    at Auth.createCustomToken (/user_code/node_modules/firebase-admin/lib/auth/auth.js:89:37)
    at /user_code/index.js:29:26
    at process._tickDomainCallback (internal/process/next_tick.js:129:7)
如何配置云函数以使用私钥

admin.initializeApp(functions.config().firebase);
不幸的是,该方法需要一个私钥来创建自定义令牌,而默认凭据(恰好是一个密钥)当前不可用。如中所述,您需要提供证书凭据才能创建自定义令牌

您可以按照中的说明生成此凭据所需的证书。一旦获得了关键JSON文件,就需要将其放入Firebase的云函数中

您可以通过将密钥JSON文件存储在
/functions
文件夹中的
服务帐户.JSON
来实现这一点。然后,在定义函数的文件中,使用初始化Admin SDK,如下所示:

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

var serviceAccount = require("./service-account.json");
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: functions.config().firebase.databaseURL
});
有关如何执行此操作的完整示例,以及更详细的说明和代码示例,请查看

请注意,我们希望在将来从默认凭据添加对
createCustomToken()
的支持,但现在,您必须带上自己的凭据才能使用此特定方法。

如下所述:

要在本地测试相同的代码,请下载服务帐户JSON文件,并将GOOGLE_APPLICATION_CREDENTIALS环境变量设置为指向该文件

然后在代码中:


admin.initializeApp()

@davidtabmann:请不要使用firebase功能进行标记。正确标记为[google云功能][firebase]。也可以在这里看到我的答案:@FrankvanPuffelen,好的,我确实读过,正如前面所说的,我首先在那里等待你的回答……现在我很清楚了。这个解决方案可以工作,但是上传service-account.json和源代码是否安全?在firebase配置中存储json怎么样?哪条路更安全@frank van Puffelen如果我使用两个项目(dev和prod),您建议我使用两个不同的service-account.json文件有条件地初始化应用程序吗?我会使用functions.config().firebase.databaseURL来设置databaseURL,因此不必担心不同的环境。还为文件名设置env变量,以便您可以控制哪个serviceaccount文件与当前env一起使用。功能:配置:set@MuhammadHassan,如果您想让它变得非常紧凑和新奇,那么您可以使用当前环境为serviceaccount设置所有变量。函数:config:set。这将使服务帐户详细信息不在源代码中。对于未来的读者,此解决方案不再以这种形式与1.0.0云函数API配合使用,因为将配置对象传递到
initializeApp
的功能已被删除。我在这里问了一个后续问题: