Firebase admin.auth()。createCustomToken“让Admin SDK发现服务帐户”方法不起作用

时间:2019-06-16 05:42:12

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

我将以下代码编写为一个云函数,并且试图在服务器端(而不是客户端)运行它。

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';

admin.initializeApp();

export const getJWT = functions.https.onCall(async (data, context) => {
  if (context.auth) {
    const token = await admin.auth().createCustomToken(context.auth.uid);
    return { token: token }
  }
  return { token: null };
});

但是,它因此臭名昭著的错误而失败。

”未处理的错误{错误:需要对服务帐户项目/-/serviceAccounts/e-groups@appspot.gserviceaccount.com执行此操作需要iam.serviceAccounts.signBlob权限。有关详细信息,请参阅https://firebase.google.com/docs/auth/admin/create-custom-tokens有关如何使用和解决此功能的更多详细信息。”

该文件说有三种方法。

  1. 使用服务帐户JSON文件
  2. 离开Admin SDK发现服务帐户
  3. 使用服务帐户ID

我不喜欢#1,因为它很容易出错。因此,我尝试通过调用admin.initializeApp()来执行第二项操作,如文档所示(“要使用这些签名方法,请使用Google Application Default凭据初始化SDK,并且不要指定服务帐户ID字符串“)。

为什么不起作用?我想念什么吗?

我正在尝试在服务器端(而不是在模拟器上)运行代码。采取方法#1确实没有任何意义,我更喜欢采用方法#2。

添加:这是解决方案!

由于很难准确地找到您需要做的事情(即使在阅读完重复的答案之后),我将逐步说明。

 From the Firebase console,
(1) open the setting, 
(2) select Service account tab, 
(3) click "Manage service account permissions"
   notice that "App Engine default service account" is listed
(4) Click the "IAM" on the side bar
(5) Find the "App Engine default service account" and click the Edit button
(6) Click "+ Add Another Role"
(7) Select "Service Account Token Creator" and Save

最重要的是,您根本不需要处理危险的私钥文件,只要您在服务器端运行此代码即可。您可以保留“ admin.initializeApp();”照原样。

我在这个问题上浪费了很多时间(包括阅读有关stackoverflow的类似问题)。我希望这个答案对其他人有帮助。

0 个答案:

没有答案