GAE:无法使用Google服务器端API(白名单问题)

0 投票
2 回答
1099 浏览
提问于 2025-04-18 11:30

要使用谷歌的API,首先需要在谷歌开发者控制台激活它们,然后生成一些凭证。在我的情况下,我有一个后端需要在服务器端使用这些API。为此,谷歌页面提供了一个选项,可以生成所谓的“服务器应用程序密钥”。到这里一切都还不错。

但问题是,要生成这个密钥,你需要提供将被列入白名单的服务器IP地址。然而,谷歌应用引擎(GAE)没有我可以在这里使用的静态IP地址。

有一个选项是可以手动获取这些IP地址,方法是执行以下命令:

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

不过,这个IP地址的列表并不保证是固定的(而且众所周知,它会时不时地变化),而且我没有办法通过编程的方式自动将从dig命令中获取的IP地址添加到谷歌开发者控制台的白名单中。

这让我面临两个选择:

  1. 放弃在这个项目中使用GAE,讽刺的是,GAE不能作为谷歌API的后端(最好使用亚马逊或其他解决方案)。或者
  2. 编写一个类似监视程序的东西,监控dig命令的输出,如果有变化就通知我,然后我手动更新白名单(我可不想这么做——太危险了),或者允许所有IP使用谷歌API,只要它有我的API密钥。虽然这不是最安全的解决方案,但它能工作。

还有其他解决办法吗?难道GAE不支持在服务器端使用谷歌API吗?

2 个回答

1

是的,你应该使用应用身份。别再考虑获取IP地址或者放弃使用Google App Engine(GAE)了 :-) 下面是一个例子,展示了如何在GAE应用中使用Big Query:

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();
}
1

你可以通过应用身份来访问谷歌的API,这个功能是在AppEngine上使用的。具体可以查看这个链接: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

撰写回答