Firebase 云函数 - createCustomToken

Posted

技术标签:

【中文标题】Firebase 云函数 - createCustomToken【英文标题】:Firebase Cloud Functions - createCustomToken 【发布时间】:2017-07-31 17:57:42 【问题描述】:

将新的 Firebase Cloud Functions 与 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)

如何配置云功能以使用 private_key?

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

【问题讨论】:

@davidtabmann:请不要使用 firebase-functions 进行标记。 Cloud Functions for Firebase 的正确标记是 [google-cloud-functions][firebase]。也可以在这里查看我的答案:***.com/questions/42854865/… @FrankvanPuffelen ,好的,我确实读过here 所说的,我首先在那里等待你的答复......现在对我来说很清楚了。 【参考方案1】:

不幸的是,createCustomToken() 方法需要一个私钥来生成自定义令牌,而默认凭据(恰好是 Application Default Credential)目前不提供该私钥。如Create custom tokens using the Firebase Admin SDKs 所述,您需要提供证书凭证才能创建自定义令牌。

您可以按照Add Firebase to your app 中的说明生成此凭据所需的证书。获得密钥 JSON 文件后,您需要将其放入 Cloud Functions for Firebase。

您可以通过将密钥 JSON 文件存储在您的 /functions 文件夹中作为 service-account.json 来做到这一点。然后,在定义函数的文件中,使用 admin.credential.cert() 初始化 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
);

有关如何执行此操作的完整示例,以及更详细的说明和代码示例,请查看Instagram sign in sample。

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

【讨论】:

此解决方案有效,但使用源代码上传 service-account.json 是否安全?将该json存储在firebase配置中怎么样?哪种方式更安全? @frank-van-Puffelen 如果我使用两个项目(dev 和 prod),您是否建议我使用两个不同的 service-account.json 文件有条件地初始化应用程序? 我会使用functions.config().firebase.databaseURL来设置databaseURL,所以不用担心不同的环境。还为文件名设置环境变量,以便您可以控制哪个服务帐户文件与当前环境一起使用。功能:配置:设置 @MuhammadHassan,如果你想让它变得非常紧凑和花哨,那么你可以使用当前环境为 serviceaccount 设置所有变量。功能:配置:设置。这将使服务帐户详细信息远离源代码。 对于未来的读者,此解决方案不再以这种精确的形式与 1.0.0 云函数 API 一起使用,因为将配置对象传递给 initializeApp 的功能已被删除。我在这里问了一个后续问题:***.com/questions/49656429/…【参考方案2】:

如此处所述:https://firebase.google.com/docs/auth/admin/create-custom-tokens?authuser=0

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

然后在你的代码中:

admin.initializeApp();

【讨论】:

以上是关于Firebase 云函数 - createCustomToken的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebase 云函数发送通知,通知为空

Firebase 云函数更改超时

部署 Firebase 云函数时出错

Firebase 可调用云函数 CORS 错误

使用 Python 的 Firebase 云函数?

Firebase 云函数返回 304 错误然后重启