如何保护基于Rest的API?

时间:2012-11-26 19:28:36

标签: rest post get

我们打算开发基于休息的api。我探讨了这个主题,但看起来,当你的客户端是一个应用程序时,你可以保护api(所以有很多方法,公钥 - 私钥等)。那么网站/移动网站呢,如果我们访问网站中没有使用任何登录访问内容的基于休息的api(登录是可选的)那么我们怎样才能限制其他人访问基于休息的api?

使用Oauth2.0有意义吗?我对此并不清楚。

更明确的问题可能是,我们如何确保在不使用任何登录的网站上通过网络公开获取或发布请求?

如果它是简单的获取请求或发布请求,它将返回特定输入的json数据,现在我有移动网站,谁将使用get请求或发布请求来获取数据。好吧,其他一些人也可以访问它,问题是我没有使用Login,用户可以直接访问数据。但是,我们如何限制其他人访问这些数据。

2 个答案:

答案 0 :(得分:3)

您认为保护不使用REST的网站与使用REST API的网站之间的区别是什么?

OAuth为您的站点提供授权功能,在REST架构中,这意味着移动应用程序的用户必须在允许访问资源之前提供其凭据。然后,应用程序可以决定该用户是否可以访问所请求的资源。但是你说你的网站不需要使用授权。

您可以使用证书,但要为每个客户管理证书。我的看法是为了您的解释,您不需要保护您的网站,因为您永远无法管理客户端和服务器之间的信任关系。但有一些选择:

  1. 您构建自己的客户端应用程序,并将其发送给可以使用客户端的打包证书与服务器进行验证的人员。例如。如果您为该设备构建,iOS就具有此类功能。
  2. 您提供了下载在浏览器中“安装”并在与REST API通信时使用的证书的功能
  3. 使用像握手协议之类的东西,所以当客户想要发出第一个请求时; “嗨,我是客户,我们可以聊聊吗?”服务器响应'是的,接下来的X分钟我们可以确保每次你告诉我YYYYYY时你都会发送这个密钥'(你可以使用像SecureUDID这样的东西或类似于其他设备而不是iOS)。< / LI>

    可能有其他人,但你得到了基本的想法。在我看来,如果您的资源不需要授权,那么您不需要保护该REST API。我可以问您通过此REST API或您提供的功能公开了哪种数据?这可能有助于提供更好的答案。

答案 1 :(得分:1)

您需要授权:只允许某些代理(移动客户端)和/或用户访问这些API。

要解决这个问题,您需要识别:服务器告诉谁是谁(或什么)的方式,这样才能做出正确的决定。

根据您对安全的关注程度,有许多不同的方式可以提供某种形式的识别。

最简单的是用户代理字符串,特定于您的移动客户端。但它很容易伪造。稍微更难伪造的是基于客户端的“秘密” - 在您的移动客户端代码中嵌入某种秘密或密钥。你可以把它变得非常复杂和秘密,但正如ramsinb指出的那样,你不能以这种方式获得安全性,因为它需要你能够保证你随客户端发送的秘密(它的代码,算法或任何其他花哨的构造都不能被妥协或逆向工程。当您不控制客户端时不会发生。

从那里,有3个选择:

  1. 确实不需要安全,不要打扰
  2. 确实不需要安全性,但您仍然希望限制对合法用户/代理商或准备投入一些时间来破坏您的保护的人员的访问权限 - 与特定用户代理或客户端嵌入的秘密一起使用 - 不要不会投入太多,因为它不会阻止那些真正希望获得它的人
  3. 安全是必需的 - 然后我不认为有一种方法可以验证身份,登录/密码,用户特定(设备特定?)键,OpenID等...无论如何,你都会有在某种程度上增加用户负担,尽管你可以通过允许身份验证(cookie,存储......)来限制这种负担。