2016-06-10 62 views
0

我正在开发一个android应用程序,并且我想限制对我的API访问我的网站和移动应用程序。我不想让用户登录到我的应用程序,而是注册客户端。如何在没有用户登录的情况下保护我的端点API

我refrenced这些资源完成这个任务:

这里是我做过什么迄今:

  1. 从Google云端控制台生成一个android和web客户端api密钥。它看起来是这样的:ALzfShCF_mD_IVlVVVf2783TG9FG8x7u0s-ZFQE(不是真正的关键)
  2. 做了一个常量类,添加了这些对我的的clientId

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

    API声明
  3. 新增用户的用户参数去每个方法

  4. 重建项目,部署。

所有这些资源似乎很有帮助,尤其是文档。但是,我没有注意到任何区别。我期望看到,在我遵循文档并重新部署我的后端后,我的网站和应用都无法调用我的端点功能。但是,他们都完美无瑕地工作。

以下这些帖子或文档证明我的情况,还是有什么我必须做的?我也不希望未经授权访问我的API资源管理器!

任何帮助将不胜感激!

编辑:

我用错了键,我用的是API密钥,而不是客户端ID。一旦我更新,我看到我的API请求失败,因为用户参数为空。现在我的问题是,我怎么能不通过一个非空的用户对象而没有让用户登录?

我试着制作一个GoogleAccountCredintal并将它传递给我的ApiBuilder,但是它的值始终为空。

GoogleAccountCredential credential = GoogleAccountCredential.usingAudience(context,APIClientKeys.ANDROID_CLIENT_ID); 

MyApi.Builder builder = new MyApi.Builder(AndroidHttp.newCompatibleTransport(), 
        new AndroidJsonFactory(), credential) ... 

回答

-1

如何: 设置您的服务器和您的应用程序上的密钥。假设它是SECRETKEY123。在向您的API发出请求时,请发送一个名为auth的额外参数。在其中传递你的参数和秘密密钥的md5(或任何其他,比如bcrypt)散列。(注意:不应该发布密钥)

因此,像auth = md5(param1 + param2 + SECRETKEY123);

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

+0

这是云端点的标准吗? –

+0

这种方法称为HMAC。我试图尽可能简单地描述。最标准的方法是使用oAuth我想 - 但我觉得这种方法更容易和优雅。您可以在这里阅读更多关于HMAC: https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf –

+0

谢谢,我会试试这个。 –

2

一个非常明智的web开发者曾经说过

“永远不要相信客户端”。

不管你想出以确保您的应用程序是如何复杂的机制,所需要的是一个网络督察(就像一个你可以在Web浏览器找到)和代码检查(您也可以找到您的网络浏览器)。现在有些人可能会建议让客户强化(这足以让别人看不到)。但是,如果有人真的想要使你的应用程序失效。如果他们付出了巨大的努力,并且一旦他们成功地逆向设计了客户端,他们就可以编写自己的恶意客户端来滥用您的端点。

那么你现实的做什么?有关使用某些限速技术(如Limitd)通过IP或其他参数,然后一些端点

  • 限速开始使用IP地址列入黑名单,如果他们滥用你服务,这将使它真的很难辜负你的API。
  • 强制用户登录。
相关问题