保护我的Google App Engine API端点

时间:2014-03-13 05:00:19

标签: android google-app-engine google-cloud-endpoints

我最近在保护我的应用引擎方面做了很多研究。目前,我一直在阅读以下问题以及该问题中的链接:

How do I restrict Google App Engine Endpoints API access to only my Android applications?

然而,它没有回答我的问题。我的问题类似于上面的问题,将我的端点API访问权限仅限于我的应用。当他在证书中输入正确的电子邮件时,这家伙似乎已经开始工作了。

我的问题是,如果我无需输入任何凭据即可获得相同的结果。我想要它,以便只有我的应用程序可以使用我的端点API,以防止其他应用程序滥用它并使用我的配额。我已经为我的Android应用程序获得了一个客户端ID,并将其放在我的@API注释中。为了测试它是否有效,我在另一个api类的@API表示法中为客户端id创建了一个随机值。但是,我的应用程序仍然可以使用这两个类中的方法。有什么帮助吗?

- 编辑 -

通过阅读文档并进一步研究,授权应用程序的端点方式是通过验证用户和我的API来检查用户是否为空。我的问题是,在验证用户的过程中,Google是否能够以某种方式读取我的应用程序的SHA1指纹并将其授权给其客户ID列表?如果是这样,我如何在我的端点中复制此过程,以便检查发出请求的应用程序的SHA1指纹并将其与设定值进行比较?我不太了解端点背后的机制,所以如果我理解这个错误,请纠正我。

2 个答案:

答案 0 :(得分:2)

如果Android应用程序具有访问权限,则用户可以访问。一个有动力的派对有很多选择来检查您的协议,包括将设备放在透明代理后面或只是通过调试器运行应用程序。我建议您在发布前通过ProGuard运行您的应用,因为这会让这个过程变得更加困难。

最终,您需要使您的appengine API能够抵御不受信任的各方。这只是网络的状态。

答案 1 :(得分:0)

此处介绍了如何保护端点API:http://android-developers.blogspot.com/2013/01/verifying-back-end-calls-from-android.html

秘诀是您使用以下范围从Google Play请求令牌:audience:server:client_id:9414861317621.apps.googleusercontent.com其中9414861317621.apps.googleusercontent.com是您的ClientId。

Google Play会在您的终端应用中查找ID,如果找到了ID,则会返回Google签名的JSON Web令牌。然后根据您的请求传递该ID。上面的文章说你应该把它传递给身体。我可能宁愿为此添加另一个参数,因为否则你不能再传递自己的实体了。无论如何,您的服务器后端会收到令牌,并且在处理API请求之前,您会向Google询问其是否可信。

如果使用额外参数传入令牌,则可以通过将HttpServletRequest添加到端点签名,然后使用request.getHeader(“Yourname”)将其读出来在服务器端捕获它。确保永远不要将参数添加为URL参数,因为它可能会记录在某处。

public void endpointmethod(

        // ... your own parameters here

        final HttpServletRequest request
) throws ServiceException, OAuthRequestException {
    request.getHeader("YourHeaderName") // read your header here, authenticate it with Google and raise OAuthRequestException if it can't be validated

在Android端,你可以在构建端点api时传递你的令牌,就像这样,所以你不必对每个请求都这样做:

    Yourapiname.Builder builder = new Yourapiname.Builder(AndroidHttp.newCompatibleTransport(), getJsonFactory(), new HttpRequestInitializer() {
        public void initialize(HttpRequest httpRequest) {
            httpRequest.setHeader(...);
        }})

希望这可以帮助您确保端点API的安全。它应该。