保护我的Google应用引擎API端点

4
我最近一直在研究如何保护我的应用程序引擎安全。目前,我一直在阅读以下问题和其中的链接:如何将 Google 应用引擎端点 API 访问限制为仅限我的 Android 应用程序?
然而,它并没有解决我的问题。我的问题类似于上面的问题,即将访问我的端点 API 的权限限制为仅限我的应用程序。那个人似乎已经成功地在输入正确的电子邮件到凭据中时使其工作。
我的问题是,是否可以在不需要输入任何凭据的情况下实现相同的结果。我希望只有我的应用程序才能使用我的端点 API,以防止其他应用程序滥用它并使用我的配额。我已经为我的 Android 应用程序获得了客户端 ID,并将其放置在 @API 注释中。为了测试它是否有效,我在另一个 API 类的 @API 注释中设置了一个随机值作为客户端 ID。然而,我的应用程序仍然能够使用两个类的方法。有帮助的吗?
-编辑-
从文档中阅读和进一步研究,授权应用程序的端点方式是通过对用户进行身份验证并检查用户是否为 null。我的问题是,在验证用户的过程中,Google 是否能够读取我的应用程序的 SHA1 指纹并将其授权给其客户端 ID 列表?如果可以,我该如何在我的端点中复制此过程,以便我检查发出请求的应用程序的 SHA1 指纹并将其与设置值进行比较?我不太了解端点背后的机理,所以如果我理解有误,请纠正我。

1
希望有人能给你一个好的答案,但我认为这将是困难的。例如,非官方的 Snapchat 客户端数量如此之多的原因是非官方应用程序访问 Snapchat 应用引擎端点的便利性。如果可以做到的话,我想 Snapchat 现在应该已经采取行动了。 - Amru E.
但是不知何故,当通过授权应用程序的客户端ID对用户进行身份验证时,Google可以限制API访问权限。它是如何做到的?我将编辑我的问题以更具体地说明。 - user3121574
@AayCee,你最后是否按照你的编辑描述成功解决了这个问题?我也遇到了同样的困扰。 - myanimal
抱歉回复晚了。我从未能够弄清楚Google如何读取我的应用程序的SHA1指纹,或者它是否真的这样做了。我想出了两个解决方案。一个是让我的应用程序发送一个秘密短语,我的服务器将验证该短语。然而,这种方法只提供临时的安全性,因为一旦应用程序被公开,人们就可以反向工程应用程序并读取秘密短语。目前我唯一的可行解决方案是构建我的服务器,使其不返回任何信息,除非提供特定请求信息。 - user3121574
2个回答

2
如果安卓应用程序有访问权限,那么用户也有访问权限。一个有动机的人有很多选项来检查您的协议,包括将设备放在透明代理后面或仅通过调试器运行应用程序。我建议在发布之前通过ProGuard运行您的应用程序,因为这将使该过程变得更加困难一些。

最终,您需要使您的appengine API对不受信任的人具有强大的鲁棒性。这只是网络的状态。


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,并返回一个由Google签名的JSON Web Token(如果找到该id)。然后,您将该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更加安全。它应该可以做到。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接