如何在没有用户登录的情况下保护我的Endpoints API

时间:2016-06-10 18:29:37

标签: android google-app-engine

我正在开发一个Android应用,我想限制访问我的网站和移动应用程序的API。我没有兴趣让用户登录我的应用程序,而是注册客户端。

我已经为这项任务补充了这些资源:

这是我到目前为止所做的:

  1. 从Google云端控制台生成Android和Web客户端API密钥。它看起来像这样:ALzfShCF_mD_IVlVVVf2783TG9FG8x7u0s-ZFQE(不是真正的密钥)
  2. 制作一个常量类,将其添加到我的clientIds API声明中

    clientId {android_key,web_key}&&观众{web_key,android_audiance}

  3. 为每个方法添加了用户用户参数

  4. 重建项目,已部署。

  5. 所有这些资源似乎都很有帮助,尤其是文档。但是,我没有发现任何差异。我希望看到,在我按照文档并重新部署后端后,我的网站和应用程序都无法调用我的端点功能。然而,他们都完美无瑕地工作。

    关注这些帖子或文档会证明我的情况,还是还有其他我必须做的事情?我也不希望未经授权访问我的API资源管理器!

    任何帮助将不胜感激!

    编辑:

    我使用了错误的密钥,我使用的是API密钥而不是CLIENT ID。一旦我更新了,我看到我的API请求失败,因为用户参数为空。现在我的问题是,如何在不让用户登录的情况下传递非null用户对象?

    我尝试制作GoogleAccountCredintal并在我的Async任务中将其传递给我的ApiBuilder,但它始终为null。

    GoogleAccountCredential credential = GoogleAccountCredential.usingAudience(context,APIClientKeys.ANDROID_CLIENT_ID);
    
    MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(),
                        new AndroidJsonFactory(), credential) ...
    

2 个答案:

答案 0 :(得分:3)

一位非常聪明的网络开发者曾经说过

  

“永远不要相信客户”。

无论您使用多么复杂的机制来保护您的应用程序,只需要一个网络检查器(就像您可以在网络浏览器中找到的那样)和一个代码检查器(您也可以在网站上找到它) - 浏览器)。现在有些人可能会建议你对你的客户进行整合(那就是错误地修改代码,以至于有人不能只看到它)。但是,如果有人真的想要解除您的应用程序。他们将付出巨大努力,一旦成功逆向设计您的客户端,他们就可以编写自己的恶意客户端来滥用您的终端。

那么你能从现实中做些什么呢?

  • 使用某些速率限制技术(如Limitd)通过IP或其他参数对某些端点进行速率限制,然后在滥用您的服务时将IP列入黑名单,这将使您很难滥用您的API。
  • 强制用户登录。

答案 1 :(得分:-1)

这个怎么样: 在您的服务器和您的应用上设置密钥。让我们说它是SECRETKEY123。在向您的API发出请求时,请发送一个名为auth的额外参数。在其中传递参数和密钥的md5(或任何其他,比如bcrypt)散列。 (注意:不应张贴密钥)

所以像auth = md5(param1 + param2 + SECRETKEY123);

然后在您的服务器上使用已存储在服务器上的密钥执行相同的哈希。比较两个哈希值 - 即您提交的哈希值和您在服务器上生成的哈希值。如果匹配允许访问 - 否则限制访问。