【问题标题】:How to simple secure APIs on App Engine with API key?如何使用 API 密钥简单地保护 App Engine 上的 API?
【发布时间】:2020-02-16 15:56:49
【问题描述】:

我希望保护我的 API 端点,以便只有授权的应用程序才能访问或写入它。我的堆栈:

  1. Flask(API 建立在 Flask-Restplus/Flask-Restless 等价物之上)
  2. GCP - App Engine 标准

我的主要需要是保护 API,以便未经授权的各方无法针对我的端点(例如 https://api.example.com/v1/fruits/1)提出请求。我遇到了 GCP 的Endpoints,其 API Key 安全模型基于 OpenAPI (Swagger)。就像 Google 似乎discourage it 一样,使用密钥应该适用于我的用例(尽管我最终可能需要通过添加基于令牌的身份验证来加强它)——这是一个好的开始。

我已经关注了docs 关于如何在 App Engine 上设置 API 密钥的问题,并且遇到了动态指定“路径”属性的问题(而不是将它们全部硬编码,因为我有很多路由并且正在使用 Flask-Rest* 扩展。也就是说,我已经定义了路由,所以 我不想在 swagger 配置文件中再次定义它们)。我在“路径”属性上尝试了以下操作:

  1. 将属性保留为未定义/为空。导致部署错误:Invalid OpenAPI file. Please fix the schema errors:\nerror: object has missing required properties ([\"paths\"])
  2. 使用“通配符”语法匹配,如下所示。错误:Please fix the schema errors:\nerror: instance type (null) does not match any allowed primitive type (allowed: [\"object\"])

问题:在不重新声明 OpenAPI 配置文件中的所有路由的情况下,将 API 密钥要求应用于我的所有路由的可扩展方式是什么? 我没有尝试使用 OpenAPI 创建 API,只是想在这里使用密钥/秘密。

或者,在使用我错过的 GAE/GCP 或 Flask 时,是否有更简单的方法来保护端点?我觉得这是一个很常见的问题,并且想象一下存在某种即插即用的解决方案

更多背景信息

  • 我查看了这个用户名+密码,基于令牌的Flask-auth tutorial。不幸的是,我的移动和网络应用程序(API 客户端)使用联合 Firebase 身份验证,因此我们没有用户名/密码支持来生成令牌。这似乎也像是在重新发明轮子
  • Swagger 3 API 密钥说明

【问题讨论】:

  • 当你说“我不是想使用 OpenAPI 来创建 API,只是想在这里使用密钥/秘密”。我假设您没有使用 Cloud Endpoints。您是否仅使用 App Engine 来部署您的 API?如果是这样,您将无法根据此doc 使用 API 密钥来保护 App Engine 应用。
  • @dhauptman 是的,我只使用 GAE 来部署和托管 API。我希望使用 Cloud Endpoints 来保护我的 API,从 cloud.google.com/endpoints 看到它允许“控制谁可以访问您的 API 并使用 JSON Web 令牌和 Google API 密钥验证每个调用”。您还推荐了哪些其他策略,以便只有我的应用(原生移动和网络)才能访问我的 API?

标签: google-app-engine flask swagger openapi google-app-engine-python


【解决方案1】:

最好的建议是使用Cloud Endpoints,因为您将有更多选项来管理和保护您的 API。

如果出于某种原因您不想使用 Endpoints,您可以使用一些 GAE 身份验证选项:

具有服务到服务身份验证的 GAE,检查 here

带有用户身份验证的GAE,请检查here

您还可以使用Cloud IAP 保护您的应用程序和资源。

【讨论】:

  • 我已经研究过 Cloud Endpoints 并且确实想使用它,但遇到了我在帖子中描述的具体问题。如何使用 Endpoints + OpenAPI(API 密钥选项)而无需在 openapi-gae.yaml 中手动声明 [重新定义] 我的所有路径?
  • 根据Restplus documentation,您可以导出从注释中自动生成的 Swagger 规范,因此您无需对规范进行硬编码。您可能还对this document 感兴趣,了解如何使用 Restplus 定义 api 键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
  • 2012-07-13
  • 2019-01-12
  • 2018-07-04
  • 2018-07-17
  • 2018-06-30
相关资源
最近更新 更多