API是移动应用程序的后端。我不需要用户验证。我只需要一种方法来保护对该API的访问。目前,我的后端已暴露。
documentation似乎只谈论用户身份验证和授权,这不是我在这里所需要的。我只需要确保只有我的移动应用可以与该后端通信,而没有其他人可以与之通信。
是的,您可以这样做:使用身份验证来保护端点,而无需执行用户身份验证。
[我发现这种方式并没有得到很好的记录,而且我自己实际上还没有做到,但是我打算这样做,所以当我看到某些IO13视频正在讨论这种方式时,我就非常注意(我认为那是我看到的地方):
这是我对所涉及内容的理解:
您将这些客户端ID添加到端点的可接受ID列表中。您会将User参数添加到端点,但由于未指定用户,因此它将为null。
@ApiMethod( name = "sendInfo", clientIds = { Config.WEB_CLIENT_ID, Config.MY_APP_CLIENT_ID, Config.MY_DEBUG_CLIENT_ID }, audiences = { Config.WEB_CLIENT_ID } // Yes, you specify a 'web' ID even if this isn't a Web client. ) public void sendInfo(User user, Info greeting) {
这里有一些有关上述内容的不错的文档:https://developers.google.com/appengine/docs/java/endpoints/auth
您的客户端应用在制定端点服务调用时将指定这些客户端ID。所有OATH详细信息将在客户端设备的后台处理,以便将您的客户端ID转换为身份验证令牌。
HttpTransport transport = AndroidHttp.newCompatibleTransport(); JsonFactory jsonFactory = new JacksonFactory(); GoogleAccountCredential credential = GoogleAccountCredential.usingAudience( ctx, Config.WEB_CLIENT_ID ); //credential.setSelectedAccountName( user ); // not specify a user Myendpoint.Builder builder = new Myendpoint.Builder( transport, jsonFactory, credential );
此客户代码只是我的最佳猜测-对不起。如果还有其他人可以确切了解客户端代码的外观,那么我也将很感兴趣。
很抱歉,谷歌没有为您的问题提供解决方案(这也是我的问题)。您可以使用他们的API密钥机制(请参阅https://developers.google.com/console/help/new/#usingkeys),但是由于Google自己的API资源管理器(请参阅https://developers.google.com/apis-explorer/#p/),该策略存在很大漏洞,这是测试API的强大开发工具,但可以暴露所有Cloud端点API,而不仅仅是Google服务API。这意味着具有您项目名称的任何人都可以随意浏览和调用您的API,因为API资源管理器规避了API密钥安全性。我发现了一种变通方法(基于bossylobster对本文的强烈回应:Simple Access API (Developer Key) with Google Cloud Endpoint (Python)),该变通方法是在客户端API中传递不属于消息请求定义的请求字段,然后在API服务器中读取该字段。如果找不到未记录的字段,则会引发未授权的异常。这将填补API资源管理器创建的漏洞。在iOS(我用于我的应用程序)中,您可以向每个请求类(由Google的API生成器工具创建的类)添加一个属性,如下所示:
该文档仅适用于客户。我需要的是文档有关如何在服务器端提供服务帐户功能的信息。