【发布时间】:2020-12-24 12:45:59
【问题描述】:
场景
我在 Cloud Run(grpc,但问题也适用于 http)中托管我希望保护的 API。目标是提供对我们组织中多个应用程序的访问。请注意,每个应用程序都有多个在另一个位置运行的实例(每个外部客户端一个)。该 API 仅供内部使用,不会被网络浏览器直接访问。
选项
我已经确定了以下选项:
- 不使用 Cloud Endpoints:我可以让我的 API 不公开并由服务帐户保护。 Bearer 令牌(id 令牌)可以在应用程序中自动生成。
- Cloud Endpoints + API 密钥:对于每个应用程序,我都会生成一个 API 密钥,供该应用程序的所有实例使用。这很容易设置,因为它只需要发送一个额外的标头。
- Cloud Endpoints + 自签名 jwt:我使用服务帐户生成自签名令牌(请参阅 GCP documentation on Service-to-Service communication)并使用该服务帐户配置端点。多个应用程序要么获得自己的服务帐户,要么我从同一个帐户生成新密钥。请注意,并非所有库都提供自签名令牌,并且需要一些手动工作。因此刷新令牌也是手动的。
- Cloud Endpoints + Google ID:仅提供身份验证,不提供授权。这也意味着拥有 Google 帐户的每个人都可以访问我的 API (!)。优点是生成 ID 令牌的工具很简单。
- Cloud Endpoints + API Key + Google ID
- Cloud Endpoints + API Key + 自签名 jwt
问题
- 哪个选项最适合我的方案? (欢迎提出其他选择/建议)
- 选项 1 通常被认为是安全的吗?如果是这样,为什么还要使用 Cloud Endpoints?
- Google 文档提到了不同形式的身份验证(请参阅GCP documentation on Authentication methods)。但是,感觉其中一些是授权(例如 API 密钥和服务帐户),而其中一些是身份验证(例如 Google ID)。这是一个正确的评估吗?
- 我假设 GCP 了解 3 处理服务帐户,并且可以以自己的方式验证它们;没有服务帐户密钥的人无法获得访问权限。
- 在选项 3 中:我认为使用多个服务帐户更好,每个应用程序一个,最好每个实例一个密钥。这会被认为是选项 3 的最佳方式吗?
- 是否值得在实际 API 中执行额外的验证?如果是这样,我为什么还要使用 Cloud Endpoints?
- GCP 文档没有提到选项 4 的大问题。我认为这应该更清楚。
- 使用选项 5 有什么好处?我可以识别谁拨打电话的事实?那为什么不制作更多的 API 密钥呢?
- 选项 6 有用吗?虽然这在 Cloud Endpoints 中被视为身份验证,但这实际上是授权,对吗?
- 如果 API被网络浏览器访问会发生什么变化?
【问题讨论】:
标签: authentication google-cloud-platform google-cloud-endpoints google-cloud-run