Cloud Endpoints,将角色授予 API 键以限制某些 methods/paths(例如:read/write 角色)

Cloud Endpoints, grant roles to API keys to restrict some methods/paths (e:g read/write roles)

背景

我用云函数和云创建了多个微服务运行。现在,使用 Cloud Endpoints,我可以使用 API 密钥安全地触发我的所有服务。但是,我希望能够控制允许每个 API 键访问哪个微服务。我只想由用户 使用一个 API 键。

例子

假设我正在建立交易 API,出于安全考虑,当客户创建 API 密钥时,他可以选择 API 密钥是否只允许读取数据(例如:观察市场价格)或同时读取和写入数据(例如:观察市场价格然后下订单)。用户可以轻松更改他的 API 密钥权限。

我没有构建任何像交易一样敏感的东西 API 但这是我正在尝试做的一个很好的例子。

研究

我看过 。接受的答案提出了两种解决方案:

我也相信像 Apigee 这样的服务可以满足我的需要,但我的预算 (POC) 很低,所以我认为它不适合我,我更愿意使用仅限 GCP 产品。

问题

Cloud Endpoints 是否为我的用例提出了开箱即用的解决方案?如果是这样,我该怎么办?

如果没有,是否可以:

TL;DR:使用 Cloud Endpoint 是不可能的

关于 Cloud Endpoint 需要知道的事情和限制很少:

  • Cloud Endpoint 执行身份验证,而不是授权。简而言之,检查您的用户凭据(auth0、OAuth2、Firebase auth、API Key)是否有效。
    • 仅适用于 API 密钥,您可以将密钥限制为一项或多项服务 URL。然后,如果需要,您可以在此处将 API 密钥限制为仅一个 Cloud Endpoint。
  • API 键 "authenticates" 一个 GCP projet, not a user, not an account
    • 如果您在同一个项目中创建 2 个密钥,您将无法区分请求者 -> 您必须为每个客户创建 1 个项目并为每个项目生成一个 API 密钥
  • (与上一点相关)API 无法通过脚本自动创建密钥。您必须在控制台上手动执行此操作(如果您有很多客户要注册,或者如果您想要自动注册,这将很难)

有了这些输入,您就可以设计解决方案了:您可以自己执行授权检查(您提到的代理),而不是 API 键字符串值,而是 project_id。我向您推荐此解决方案,因为您可以 add quotas and rate limit on API Keys(I wrote an article on this)

你也可以实现你自己的授权过程(甚至你自己的API密钥生成,它只是最后一个字符串!),更复杂...