2016-02-27 43 views
11

我建立我自己的API:安全我的API与正在使用的API密钥

1)Android应用程序 2)桌面应用程序

我的一个网址是:http://api.chatapp.info/order_api/files/getbeers.php从我用户通过JSON从我的数据库中获取数据。我最近在考虑使用API​​密钥创建身份验证。

关于如何做到这一点的任何想法?或者我必须做一些像http://api.chatapp.info/order_api/files/getbeers.php?api_key=之类的东西,然后将GET方法与存储在我的数据库中的一些密钥进行比较?

任何想法?

+0

是你想拥有API密钥进行验证,以确保您的数据或者是它只是监控使用情况的主要原因是什么?有一些简单的方法可以生成和使用API​​密钥来监视使用情况,以及更深入的身份验证方法(如使用OAuth)来保护数据的安全性。 – Mike

+0

我想保持我的数据更安全....我怎么做oAuth? –

+0

如果这是为了安全起见,最糟糕的事情就是推出自己的解决方案。使用经过测试的软件包(如OAuth)总是更好。他们已经修复了你尚未意识到的问题。 – jairbow

回答

2

作为@mike提到的,OAuth是复杂的API,更重要的是需要在某处运行的第三个服务端点为访问提供认证/授权。

一想到你肯定不要想要做的就是在URL中包含API密钥。这很容易被代理重播和/或欺骗和识别,并在日志文件中捕获。更好的解决方案是将API密钥作为附加HTTP头包含在请求中,并在API端点中查找该特定值。

对于一个简单的用例像你所建议的,你会发现它值得认证与你保持作为你的Android应用程序和API端点之间的共享秘密的关键API调用。如果你采取这种方式,它不容易改变,如果妥协意味着一个真正的PITA可以启用一个新的密钥并置入。

如果使用“共享的秘密”,那么我建议制作相对容易(或至少有一些UI)也为用户的更新情况下关键它的破坏。我假设你可以很容易地更新你的网络服务。这个过程并不像OAuth或OAuth2那样安全,但实现起来更加简单快捷,同时仍然提供了合理的“安全级别”(在这种情况下,安全性意味着“您可以访问此API”)。

+0

,如果我去的授权:基本哈希? –

+0

如果遵循此路径,则可以使用单向散列(如SHA-256)或只是一个纯粹的随机值作为共享密钥。我不建议将值设置为“可解密”(即使用任何类型的对称密码),并根据此Q上的其他响应,明确地执行您需要将值远离日志的值 - POST中的数据或标题在我上面提出的请求中。 – heckj

+0

如果我用BCRYPT算法使用php的password_hash()会怎么样? –

2

OAuth是一个复杂的协议,可以通过谷歌搜索和阅读文档更好地学习,但这可能是保护您的API端点的一个很好的选择。

简而言之,OAuth是一种让用户通过证明允许访问您的API来访问您的API的方法,然后使用您提供的安全“访问令牌”。

  1. 客户端通过传递一个“API密钥”和某种“秘密钥匙”的请求从API服务器的访问令牌。这些提供给您的API用户在注册时使用您的API。

  2. 如果从客户端传递给API服务器的凭据是正确的,那么API服务器会以“访问令牌”响应。此访问令牌有一定的时间,并且应该随后发送所有请求,以证明客户端已被授予使用API​​的权限。

  3. 客户端向您的API服务器发出一个API请求数据,并且必须包含“访问令牌”。如果包含“访问令牌”并且仍然有效(即尚未过期),则可以用他们请求的数据进行响应。

以下是一些资源链接,可帮助您了解如何在API中实现OAuth。

OAuth Docs

http://scottksmith.com/blog/2014/07/02/beer-locker-building-a-restful-api-with-node-oauth2-server/ http://www.devx.com/webdev/create-your-own-rest-api-using-oauth-authentication.html

参见this link为1.0的OAuth和OAuth 2.0的比较,以确定哪个更好你的情况使用。

2

如果你需要认证用户,那么我会去与Oauth。如果不是,则将请求参数的加密校验和添加到自定义请求标头。