我尝试将 iOS 应用程序的公共 API 访问密钥从 iOS 客户端发送到 Google App Engine (GAE) 应用程序。
iOS 客户端使用 Google Cloud Endpoints(反过来使用用于 Objective-C 的 Google APIs 客户端库)来联系服务器,如下所示:
GTLServiceMyApp *service = [[GTLServiceMyApp alloc] init];
service.APIKey = ...
GTLQueryMyApp *query = [GTLQueryMyApp queryForAPITest];
[service executeQuery: query completionHandler: ^(GTLServiceTicket *ticket, id response, NSError *error) {
NSLog(@"error=%@", error);
}];
这在某种程度上按预期工作。如果客户端发送 API 密钥但未定义任何密钥,则会收到特定错误。如果客户端发送正确的 API 密钥(如com.mydomain.MyApp
在 Google Developers Console 中为捆绑标识符定义的那样),则调用成功,但如果客户端发送错误或已删除的 API 密钥,它会再次收到特定错误。
奇怪的是,在服务器上使用此代码来检查 API 密钥是否存在(即用 引用它request.getParameter("key")
)客户端收到意外错误:
@ApiMethod
public void test(HttpServletRequest request) {
String key = request.getParameter("key");
...
}
错误如下。这是出乎意料的,因为传递的 API 密钥包含一个包标识符(不是每个 IP 或每个引用者的限制),即正确的 ( com.mydomain.MyApp
)。
您的 API 密钥上配置了 per-IP 或 per-Referer 限制,并且请求与这些限制不匹配。如果应允许来自此 IP 或引用者的请求,请使用 Google Developers Console 更新您的 API 密钥配置。
这是功能还是错误?谁能告诉这里发生了什么以及 GAE 应用程序如何检查(有效)API 密钥是否存在。
更新如果我修改 API 密钥以允许任何应用程序(即使用空的捆绑标识符列表),客户端会收到此错误:
访问未配置。您的项目未启用 API (MyApp)。请使用 Google Developers Console 更新您的配置。