【问题标题】:Unable to assign iam.serviceAccounts.signBlob permission无法分配 iam.serviceAccounts.signBlob 权限
【发布时间】:2019-12-25 03:09:43
【问题描述】:

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

我正在构建一个测试,其中涉及使用 firebase Auth 铸造自定义令牌。当我击中时:

  const token = await admin.auth().createCustomToken('test', {
    isAdmin: true,
  })

抛出以下错误

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

referenced documentation 中,它表示将Service Account Token Creator 角色添加到服务帐户。我已添加该角色(以及尝试服务帐户管理员无济于事。

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

- members:
  - serviceAccount:dashboard@appspot.gserviceaccount.com
  role: roles/iam.serviceAccountTokenCreator

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

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

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

【问题讨论】:

    标签: google-cloud-platform firebase-authentication google-iam google-cloud-iam


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢您的回复!不过我有点困惑,提供给initializeApp 的服务帐户不是代码使用的服务帐户吗?我正在使用相同的服务帐户,当我查看已初始化的应用程序选项时会看到它列出来。 admin.initializeApp({ projectId:project, serviceAccountId: dashboard@appspot.gserviceaccount.com', });
    • 用您的代码编辑您的问题。包含足够的内容以查看从初始化到服务帐户使用的所有内容
    • 您的代码在哪里运行(Compute Engine、App Engine、您的桌面)?您的初始化代码仅适用于 Google 服务,因为它依赖于 ADC。在 Google 之外,您需要使用服务帐号 JSON 密钥文件来初始化 Firebase。
    • 我的代码在我的桌面上运行。我在我的用户帐户中使用了gcloud auth application default,所以这个初始化看起来类似于我初始化存储、pubsub 等的方式。firebase 管理员与其他 SDK 有不同的限制吗?
    • 用户 id 是什么(gcloud auth list)。验证用户 id 是否具有上述权限。
    【解决方案2】:

    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. 添加角色服务帐户令牌创建者

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

    【讨论】:

    • 有没有办法只针对特定的电子邮件地址执行此操作?
    猜你喜欢
    • 2020-06-27
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2022-09-28
    相关资源
    最近更新 更多