【发布时间】:2020-02-16 15:56:49
【问题描述】:
我希望保护我的 API 端点,以便只有授权的应用程序才能访问或写入它。我的堆栈:
- Flask(API 建立在 Flask-Restplus/Flask-Restless 等价物之上)
- 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 配置文件中再次定义它们)。我在“路径”属性上尝试了以下操作:
- 将属性保留为未定义/为空。导致部署错误:
Invalid OpenAPI file. Please fix the schema errors:\nerror: object has missing required properties ([\"paths\"]) - 使用“通配符”语法匹配,如下所示。错误:
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