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因此这似乎是一个死胡同。
Firebase 在其文档中提到了这个错误:
https://firebase.google.com/docs/auth/admin/create-custom-tokens#failed_to_determine_service_account
您必须通过 JSON 配置文件正确初始化您的应用程序。
一个简单的解决方法是:
几分钟后,您的项目将能够创建签名令牌。
sign服务帐号的功能需要iam.serviceAccounts.signBlob权限。此权限包含在服务帐户令牌角色中roles/iam.serviceAccountTokenCreator
您可以在“项目”级别或“服务帐户”级别分配此角色。这就是为什么你会看到不同的结果。在项目级别分配角色会影响所有服务帐号的权限。在服务帐户上分配角色只会影响该服务帐户。
你的问题的关键是调用者在服务帐户上没有这个角色dashboard@appspot.gserviceaccount.com。您已授予服务帐户权限,而不是调用方。查看用于设置 Firebase SDK 的服务帐户的代码。
如果您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”中找到它。
| 归档时间: |
|
| 查看次数: |
5429 次 |
| 最近记录: |