【问题标题】:API Key Restriction for Google API Called from URL Fetch within App Engine从 App Engine 中的 URL Fetch 调用的 Google API 的 API 密钥限制
【发布时间】:2017-03-04 23:46:24
【问题描述】:

我有一个用于 Google API 的 API 密钥,我想在对它的所有请求中使用它。其中一些请求将来自 Google App Engine (Python 2.7) 应用程序。本来打算用UrlFetch库来完成POST请求,基本如下:

headers = {'Content-Type': 'application/json'}
payload = {'longUrl': request.long_url}
result = urlfetch.fetch([API_REQUEST_URL],
                method=urlfetch.POST,
                payload=json.dumps(payload),
                headers=headers)

json_result = json.loads(result.content)

我已将我的 API 密钥的引用限制设置为 *.[my-app].appspot.com/*,希望这将保护我的 API 密钥免遭未经授权的使用,并消除更新基于 IP 的密钥限制的需要(因为 App Engine IP 会更改所有时间)。

这种方法让我失望了,因为似乎 urlfetch 并没有自己指定引荐来源网址的值。我想我可以添加自己的推荐人,但其他人也可以。这种方法不是很安全。

最佳做法是什么?鉴于我在 App Engine 中使用 urlfetch,我应该如何限制密钥?如果我确实使用了 HTTP Referrer 限制,我应该使用哪个地址?

非常感谢。

【问题讨论】:

    标签: python google-app-engine google-cloud-storage google-cloud-endpoints


    【解决方案1】:

    你收到过这样的错误信息吗?

    Requests from referer <empty> are blocked.
    

    urlfetch 似乎不会自动附加Refer,因此您应该在请求标头中设置Refer

    headers = {'Content-Type': 'application/json','Referer': '*.[my-app].appspot.com/*'}
    

    【讨论】:

      【解决方案2】:

      正如您所观察到的,引荐来源标头可能是伪造的,因此对您的 API 密钥设置引荐来源限制一开始是毫无用处的。

      但您可以添加基于 X-Appengine-Inbound-Appid 标头的检查,该标头由 GAE 基础架构进行清理并准确识别应用程序。来自Issuing a request to another App Engine app

      当向另一个 App Engine 应用发出请求时,您的 App Engine 应用 必须通过添加标头来声明其身份 X-Appengine-Inbound-Appid 请求。如果您指示 URL 获取服务不遵循重定向,App Engine 将添加此标头 自动请求。

      要指示 URL Fetch 服务不遵循重定向,请将 fetch follow_redirects 参数为False

      注意:如果您向另一个 App Engine 应用程序发出请求,请使用其 appspot.com 域名而不是自定义 您的应用的域。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-03
        • 1970-01-01
        • 2019-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多