【问题标题】:GAE: Can't Use Google Server Side API's (Whitelisting Issue)GAE:无法使用 Google 服务器端 API(白名单问题)
【发布时间】:2014-06-29 15:00:47
【问题描述】:

要使用 Google API,在从 Google Developers Console 激活它们后,需要生成凭据。就我而言,我有一个应该使用 API 服务器端的后端。为此,可以选择生成 Google 页面所称的“服务器应用程序密钥”。到目前为止,一切都很好。

问题在于,为了生成密钥,必须提及将被列入白名单的服务器的 IP 地址。但是 GAE 没有我可以在那里使用的静态 IP 地址。

有一个选项可以手动通过执行来获取 IP:

dig -t TXT _netblocks.google.com @ns1.google.com 

但是不能保证该列表是静态的(此外,众所周知,它会不时更改),并且没有任何编程方式可以自动使用从 dig 到 Google 中添加的 IP开发者控制台。

这让我有两个选择:

  1. 忘记这个项目的 GAE,具有讽刺意味的是,GAE 不能用作 Google API 的后端(最好使用 Amazon 或其他一些解决方案)。或
  2. 在 dig 命令的输出上编写类似看门狗的程序,如果有更改会通知我,然后我会手动更新白名单(我不会这样做 - 太危险了),或者允许所有 IP使用授予它具有我的 API 密钥的 Google API。不是最安全的解决方案,但它确实有效。

还有其他解决方法吗?会不会是GAE不支持消费谷歌API的服务端?

【问题讨论】:

    标签: python google-app-engine google-api google-cloud-platform


    【解决方案1】:

    您可以使用 App Identity 从 AppEngine 访问 Google 的 API。请参阅:https://developers.google.com/appengine/docs/python/appidentity/。如果您使用云控制台设置您的应用程序,它应该已经将您的应用程序的身份添加到您的项目,但您可以随时查看。在您项目的云控制台中的“权限”选项卡中,确保您的服务帐户已添加到“服务帐户”下(格式为your_app_id@appspot.gserviceaccount.com

    此外,如果您使用可用于 python 的 JSON API 库之类的东西,您可以使用捆绑的 oauth2 库为您完成所有这些工作,使用 AppAssertionCredentials 来授权您希望使用的 API。见:https://developers.google.com/api-client-library/python/guide/google_app_engine#ServiceAccounts

    【讨论】:

    • 谢谢,但这似乎不适用于所有 Google API。例如,我正在使用谷歌自定义搜索 API,并且没有 OAuth2 范围(据我所知,它仅支持用于身份验证的 api 密钥)。所以 App Identity API 毕竟不能用来识别我的 GAE 应用程序。看起来谷歌不支持使用谷歌自己的云基础设施来处理谷歌 API ......非常荒谬的恕我直言。
    • 大多数 API 将使用 OAUTH2 身份验证和来自 AppEngine。但是,您最初的问题并未说明您专门使用 CS API,因此我相应地回答了。这可能是您不走运的一种 API。您可以尝试改用 Compute Engine。如果您有 Google 的支持,您可以开票寻求进一步的建议。
    【解决方案2】:

    是的,您应该使用 App Identity。忘记获得 IP 或放弃 GAE :-) 下面是一个如何使用 Big Query 的示例,例如,在 GAE 应用程序中:

    static {
        // initializes Big Query
        JsonFactory jsonFactory = new JacksonFactory();
        HttpTransport httpTransport = new UrlFetchTransport();
        AppIdentityCredential credential = new AppIdentityCredential(Arrays.asList(Constants.BIGQUERY_SCOPE));
        bigquery = new Bigquery.Builder(httpTransport, jsonFactory, credential)
                .setApplicationName(Constants.APPLICATION_NAME).setHttpRequestInitializer(credential)
                .setBigqueryRequestInitializer(new BigqueryRequestInitializer(Constants.API_KEY)).build();
    }
    

    【讨论】:

    • 谢谢,但这似乎不适用于所有 Google API。例如,我正在使用谷歌自定义搜索 API,并且没有 OAuth2 范围(据我所知,它仅支持用于身份验证的 api 密钥)。所以 App Identity API 毕竟不能用来识别我的 GAE 应用程序。看起来谷歌不支持使用谷歌自己的云基础设施来处理谷歌 API ......非常荒谬的恕我直言
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    相关资源
    最近更新 更多