【发布时间】:2019-03-24 19:43:11
【问题描述】:
假设我在 https://api.service.com/graphql 有一个 graphql 端点,用于在 https://www.service.com + 一个 iOS 应用 + 一个 Android 应用上构建公司的官方 UI。我想向公众公开这个 API,以便第三方应用程序可以通过查询数据在它之上构建,但是我不希望他们能够抓取我的整个数据库。
假设我们有一个类型:
type Thing {
# public fields
field1: String
field2: String
# fields only available in the official UI
field3: String
field4: String
}
还有一个查询:
{
things(limit: Int!, offset: Int): [Thing]
}
只允许公司的官方 UI 查询所有 Thing 字段并遍历所有内容的最佳方法是什么?应该只允许第三方开发者在每个事物上查询field1 和field2,并且对他们可以访问多少事物有一些限制。
选项 1
我想过要求每个客户端在每个查询请求中都包含一个令牌,以便可以检测到官方网站、iOS 应用和 Android 应用并将其“列入白名单”。但是,如果它存储在客户端上,什么会阻止有人深入研究您的 javascript / 应用程序包并找到所述令牌?
选项 2
我考虑过发布两个不同的 API 端点,它们具有两个不同的架构/限制集,例如:
https://api.service.com/graphql - 公开记录并使用有限的架构。
https://api.service.com/graphql-anon - 由官方 UI 私下使用,包含全功能/不受限制的架构。
但同样,什么会阻止用户询问应用程序的捆绑包并发现 https://api.service.com/graphql-anon 端点存在并改为使用它?
【问题讨论】: