Cloud Endpoints,向 API 密钥授予角色以限制某些方法/路径(例如:读/写角色)

Posted

技术标签:

【中文标题】Cloud Endpoints,向 API 密钥授予角色以限制某些方法/路径(例如:读/写角色)【英文标题】:Cloud Endpoints, grant roles to API keys to restrict some methods/paths (e:g read/write roles) 【发布时间】:2020-08-25 00:54:03 【问题描述】:

背景

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

示例

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

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

研究

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

使用 Auth0 并以编程方式检查用户授权 我需要监控每个 API 密钥的 API 端点的使用情况。此外,API 密钥安全性足以满足我的用例。

API 密钥我设法限制我的 API 密钥访问我的 Cloud Endpoints API,但是,我没有看到任何选项允许我的密钥仅访问云的某些路径端点 API。

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

问题

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

如果没有,是否可以:

使用 Cloud Functions 创建另一个代理,以检查 Firestore 数据库是否允许 API 密钥访问请求的方法?逻辑如下:使用 Google 提供的 API 密钥的用户请求 -> Cloud Endpoints 批准 -> 自定义代理功能批准 -> 微服务执行

自定义 ESP 以满足我的用例

自己管理所有 API 身份验证(看起来工作量很大)

【问题讨论】:

【参考方案1】:

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

使用 Cloud Endpoint 需要了解的事项和限制很少:

Cloud Endpoint 执行身份验证,而不是授权。简而言之,检查您的用户凭据(auth0、OAuth2、Firebase auth、API Key)是否有效。 仅对于 API 密钥,您可以将密钥限制为一个或多个服务 URL。然后,如果需要,您可以在此处将 API 密钥限制为仅一个 Cloud Endpoint。 API 密钥“验证”GCP projet, not a user, not an account。 如果您在同一个项目中创建 2 个密钥,您将无法区分请求者 -> 您必须为每个客户创建 1 个项目并在每个项目上生成一个 API 密钥 (与上一点相关)API Keys 不能通过脚本自动创建。您必须在控制台上手动执行此操作(如果您有很多客户要注册,或者如果您想要自动注册,那就很难了) 为什么? Google doesn't recommend to use API Key for authentication 并阻止与这个储物柜之王一起使用

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

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

【讨论】:

非常感谢您的回复!如果我理解正确,对我来说最好的解决方案是以编程方式为每个用户创建一个项目(似乎有点矫枉过正,也许这是我的一个误解?),然后使用 Cloud Endpoints 后面的反向代理进行授权,使用项目 ID。我会使用与 Cloud Endpoints 相同的 openAPI 规范。我只需要重写 x-google-backend 扩展,对吗?但我根本不明白的是,为什么我们不能简单地使用 API 密钥而不是项目 ID 来执行此操作,因为在我的理解中,1 API 密钥 = 1 用户(错误的假设?) 附带说明,我认为现在可以以编程方式创建 API 密钥,请参阅测试版中的 feature。 不错的收获!! -> 最后更新于 2020 年 5 月 7 日。 3天前我不知道这个!因此,创建现在更容易了!!但是,它显然不能解决您的最新假设(1API 密钥 = 1 个用户)。查看用于创建 API 密钥的 API 调用gcurl https://apikeys.googleapis.com/v2beta1/projects/PROJECT_NUMBER/keys -> 您没有提及任何电子邮件,仅提及项目编号。 Cloud Endpoint 验证后您将在 API 中获得的数字。 我应该提到的是,我可以将我创建的每个 API 密钥映射到特定用户。事实上,我将成为从我的 CRM 创建 API 密钥的人,在那里我拥有有关用户的所有信息(它是一个私有 API),然后我将 API KEY 交给用户。在这方面,我认为这是实现 1 API key = 1 User 的解决方法,对吗?通过这种解决方法,我认为我应该能够使用 Cloud Endpoints 功能,例如配额和监控,并将日志映射到每个 API KEY(即每个 CRM 客户端)。 至于微服务的授权限制,我会按照上面讨论的做一个反向代理。对于对此主题感兴趣的其他人,AWS Api Gateway 和 Lambda 授权者也可以成为该问题的(更简单/开箱即用的)解决方案。 @guillaume blaquiere 谢谢你的帮助!继续在 Medium 上的出色工作,你的文章真的很有帮助,事实上,我已经阅读了其中一些 eheh :) !

以上是关于Cloud Endpoints,向 API 密钥授予角色以限制某些方法/路径(例如:读/写角色)的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Endpoints 相当于 API 网关,还是 Endpoints 相当于微服务?

Google Cloud Endpoints 与 Cloud Datastore api 服务之间的比较

Google 的 API Gateway 和 Cloud Endpoints 之间的区别

Cloud Run + Cloud Endpoints + Service Account Authentication – 在 curl 中有效,但在 JS 中使用 fetch API 时无效

Angular 4 前端中的 CORS 问题,Google Cloud Endpoints 运行 go API 后端

Google Cloud Endpoints:身份验证问题(错误 403)