无法分配 iam.serviceAccounts.signBlob 权限

tri*_*kol 14 google-cloud-platform firebase-authentication google-iam google-cloud-iam

TLDR;我在为服务帐号分配 IAM 权限时遇到问题。

我正在构建一个测试,涉及使用 firebase Auth 生成自定义令牌。当我打:

  const token = await admin.auth().createCustomToken('test', {
    isAdmin: true,
  })
Run Code Online (Sandbox Code Playgroud)

抛出以下错误

Permission iam.serviceAccounts.signBlob is required to perform
this operation on service account 
projects/-/serviceAccounts/dashboard@appspot.gserviceaccount.com.;
Please refer to 
https://firebase.google.com/docs/auth/admin/create-custom-tokens
for more details on how to use and troubleshoot this feature
Run Code Online (Sandbox Code Playgroud)

引用的文档中,它说将服务帐户令牌创建者角色添加到服务帐户。我已经添加了该角色(以及尝试服务帐户管理员无济于事。
图片验证权限

我可以验证我的权限似乎设置正确,当我运行时, gcloud projects get-iam-policy project我可以看到我的服务帐户附加到所需的角色

- members:
  - serviceAccount:dashboard@appspot.gserviceaccount.com
  role: roles/iam.serviceAccountTokenCreator
Run Code Online (Sandbox Code Playgroud)

但是,如果我查看该特定服务帐户,它似乎显示为空,这与我的错误一致:

gcloud iam service-accounts get-iam-policy dashboard@appspot.gserviceaccount.com
etag: ACAB
Run Code Online (Sandbox Code Playgroud)
  • 为什么这两个命令和云控制台会显示不同的信息?

我认为导致我的服务帐户权限显示为空白的原因是罪魁祸首,但我不确定在哪里进一步调试。在我看来,唯一的区别是一个命令被调用,其中包含一个项目,但我使用项目 ID 初始化了我的 firebase 应用程序,并已对其进行了验证,(firebase-admin).apps[0].options因此这似乎是一个死胡同。

Mar*_*nto 9

Firebase 在其文档中提到了这个错误:

https://firebase.google.com/docs/auth/admin/create-custom-tokens#failed_to_determine_service_account

您必须通过 JSON 配置文件正确初始化您的应用程序。

一个简单的解决方法是:

  1. 转到https://console.cloud.google.com/iam-admin/iam?project=PROJECT_NAME
  2. 编辑您的默认服务帐户。
  3. 添加角色 Service Account Token Creator

几分钟后,您的项目将能够创建签名令牌。


Joh*_*ley 7

sign服务帐号的功能需要iam.serviceAccounts.signBlob权限。此权限包含在服务帐户令牌角色中roles/iam.serviceAccountTokenCreator

您可以在“项目”级别或“服务帐户”级别分配此角色。这就是为什么你会看到不同的结果。在项目级别分配角色会影响所有服务帐号的权限。在服务帐户上分配角色只会影响该服务帐户。

你的问题的关键是调用者在服务帐户上没有这个角色dashboard@appspot.gserviceaccount.com。您已授予服务帐户权限,而不是调用方。查看用于设置 Firebase SDK 的服务帐户的代码。

  • 您的代码在哪里运行(Compute Engine、App Engine、您的桌面)?您的初始化代码仅适用于 Google 服务,因为它依赖于 ADC。在 Google 之外,您将需要使用服务帐户 JSON 密钥文件来初始化 Firebase。 (2认同)

sol*_*our 7

如果您iam.serviceAccounts.signBlob required在使用 Firebase Cloud Functions 后仍然收到错误消息,那么您需要记住以下几点。

  • 如果您正在运行“Firebase Local Emulator”或非 Google 环境(即不使用 Google Cloud),那么您的最佳选择是使用服务帐户 JSON 文件。请注意,在这种情况下,JSON 文件中定义的服务帐户(在firebase-adminsdk-*****@PROJECT_NAME.iam.gserviceaccount.com我的例子中)不需要具有Service Account Token Creator角色,因为 JSON 文件本身包含私钥。这不是一种非常安全的处理方式,但也没有太多其他选择。

  • Firebase Cloud Functions 有 2 种不同的风格:第一代和第二代。第一代的服务帐户通常为YOUR_PROJECT_NAME@appspot.gserviceaccount.com,第二代的服务帐户为RANDOM-NUMBER-compute@developer.gserviceaccount.com。如果您使用的是第二代云功能,则需要提供Service Account Token Creator给第二代的服务帐户。您可以在“Google Cloud Console -> 您的项目 -> Serverless(在左窗格中) -> Cloud Functions -> 选择函数 -> 详细信息(第二个选项卡) -> 查找Service account”中找到它。

  • 我刚刚升级到第二代云功能,这正是我的问题。要将“服务帐户令牌创建者”角色添加到我的第二代云功能的服务帐户中,我访问了[我的项目的 IAM 页面](https://console.cloud.google.com/iam-admin/iam) 并找到了“ ${rand()}-compute@developer.gserviceaccount.com` 服务帐户,然后单击右侧的“编辑主体”铅笔图标,然后单击“添加另一个角色”,然后搜索“服务帐户令牌创建者”并单击“保存`。我不得不等待几分钟才能让它发挥作用。 (2认同)