【问题标题】:Unable to sign JWT when using serviceAccountId使用 serviceAccountId 时无法签署 JWT
【发布时间】:2019-04-20 00:27:02
【问题描述】:

我们已从服务帐户密钥切换到 serviceAccountIds(或尝试这样做),因此我们可以清理我们拥有的所有 rouge 密钥。推出我们看到的变化后:

需要权限 iam.serviceAccounts.signBlob 才能对服务帐户项目/-/serviceAccounts/xxxx@xxx.iam.gserviceaccount.com 执行此操作。;请参考https://firebase.google.com/docs/auth/admin/create-custom-tokens了解更多关于如何使用和解决这个功能的细节......}}

问题是,我们肯定应用了正确的角色(见附件)。我们甚至还尝试了更多。

谢谢!

【问题讨论】:

  • 您可以尝试使用其他服务帐户吗?还要确保服务帐号和 Cloud Functions 实例属于同一个 Firebase/GCP 项目。
  • 嘿Hiranya。我尝试了一些服务帐户来检查它是否与它们的创建方式有关。还检查了环境(服务帐户名称相当独特,因此很容易从错误消息中验证)。仍然没有快乐。
  • 这很奇怪。也许您可以尝试使用您的服务帐户之一直接调用 IAM REST API。这将帮助我们排除在 SDK 级别是否发生了奇怪的事情。除此之外,我所能建议的就是联系 GCP 支持:support.google.com/cloud/contact/free_trial_support
  • 谢谢。您的意思是调用签名端点吗?你可以只提供一个服务帐户ID吗?我试试看……
  • 为什么角色合并到一个服务帐户?在我的设置中,3 个角色关联到 3 个不同的服务帐户。 firebase-admin-sdk 的编辑角色、机器人帐户的 Cloud Functions 服务代理 (...gcf-admin-robot.iam.gserviceaccount.com) 以及与属于云函数也是。

标签: firebase authentication google-cloud-platform jwt


【解决方案1】:

在这种情况下使用了两个服务帐户:

  1. 用于授权 RPC 调用的服务帐号(对于 Cloud Functions,这是 App Engine 的默认服务帐号)。
  2. 您指定为serviceAccountId 的服务帐户。

似乎 IAM 仅在两个服务帐户都具有 signBlob 权限时才有效。我已就此向 GCP/IAM 团队咨询过。同时,您可以立即尝试以下几个修复:

  • 将令牌创建者角色授予 App Engine 默认服务 您的项目帐户。
  • 一旦你这样做了,你就不必 完全指定serviceAccountId。 SDK 将自动发现相同的 在 Functions 中运行时的服务帐号 ID。

【讨论】:

  • 我今天试试这个。当我们最初遇到问题时我确实尝试过,但它没有工作,但这可能是因为它只在一个帐户上。API 调用有点令人困惑,因为服务帐户密钥在 URL 中,但需要 oauth 令牌可以来自不同的服务帐户密钥 - 我一直在调试 SDK,根据您的说法,oauth 令牌必须来自默认服务帐户。
  • 我可以在本地测试吗?我尝试将 serviceAccountId 设置为与默认帐户相同,但这不起作用。我还注意到令牌创建者角色已经被应用......在部署之后我能够创建一个令牌,但作为一个酸性测试,我从每个服务帐户中删除了令牌创建者并且仍然能够创建令牌。对实际发生的事情有任何想法吗?
  • 所以我对此进行了更多测试 - 您只需要 GAE 默认帐户上的 signBlob。您可以从 serviceAccountId 帐户中省略它。更有趣的是,如果您为 serviceAccountId 使用 GAE 帐户名称,它实际上使用证书签名并且不需要任何一个帐户都具有权限! :)
  • 是的,我还发现您只需要获得用于获取 OAuth2 令牌的服务帐户的权限(即用作凭据的那个)。我认为没有办法在不授予该服务帐户权限的情况下签署令牌。这看起来像是由 IAM 权限缓存引起的。我注意到权限撤销需要几分钟才能在 IAM 中生效。
猜你喜欢
  • 2017-12-24
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 2014-11-01
  • 2019-08-27
  • 2020-09-04
相关资源
最近更新 更多