要使用Google API,在从Google Developers Console激活它们后,需要生成凭据。在我的情况下,我有一个后端应该使用API服务器端。为此,有一个选项可以生成谷歌页面所称的"服务器应用程序密钥"。到目前为止还不错。
问题是,为了生成密钥,必须提到将被列入白名单的服务器的IP地址。但是GAE并没有我可以在那里使用的静态IP地址。
有一个选项可以通过执行手动获取IP
dig -t TXT _netblocks.google.com @ns1.google.com
然而,并不能保证列表是静态的(此外,众所周知,它会不时变化(,而且我也没有程序化的方法可以自动使用从谷歌开发者控制台中挖掘到的添加IP。
这让我有两个选择:
- 对于这个项目,忘记GAE吧,具有讽刺意味的是,GAE不能用作Google API的后端(最好使用亚马逊或其他解决方案(。或
- 对dig命令的输出进行类似看门狗的编程,如果有更改,它会通知我,然后我会手动更新白名单(我不会这么做-太危险了(,或者允许所有IP使用Google API,前提是它有我的API密钥。不是最安全的解决方案,但它有效
还有其他变通办法吗?难道GAE不支持消费Google API的服务器端吗?
您可以使用App Identity从AppEngine访问Google的API。请参阅:https://developers.google.com/appengine/docs/python/appidentity/.如果你使用云控制台设置应用程序,它应该已经将你的应用程序的身份和权限添加到你的项目中,但你可以随时查看。在项目云控制台的"权限"选项卡中,确保您的服务帐户添加到"服务帐户"下(以your_app_id@appspot.gserviceaccount.com
的形式(
此外,如果您使用类似于可用于python的JSON API Libs的东西,则可以使用捆绑的oauth2库为您使用AppAssertionCredentials来授权您希望使用的API。请参阅:https://developers.google.com/api-client-library/python/guide/google_app_engine#ServiceAccounts
是的,您应该使用App Identity。忘记获得IP或放弃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();
}