通用的方式来验证客户端并保护RESTful api

时间:2014-10-30 16:24:21

标签: api security rest authentication ssl

我一直在挖掘stackoverflow / security.stackexchange线程并且没有明确的答案为客户提供安全使用RESTful服务的通用方法我正在通过asp.net的网络构建API。在搜索这个答案时,我看到"授权"和#34;身份验证"可以互换使用,所以我想指出我只是想要验证请求身份和合法性。所以,在这一点上,我不是在验证用户。

亚马逊的模型似乎是在推出自己的模型时引用的模型,"但是,在这种情况下,我确实理解亚马逊已经提供了#34;论文"总的来说,这里没有多少重新发明。这个帖子, Designing a Secure REST (Web) API without OAuth,非常有帮助。

我收集的是:

  1. 应用程序必须要求SSL请求,因此请在" http://myapi.com/users/1"应该拒绝一个错误的请求响应,让开发人员知道需要https。
  2. 客户必须提供app密钥/密钥以验证他们是谁。
  3. SSL +证书是个好主意
  4. 需要nonce值
  5. 当客户注册他们的应用时,需要输入他们将发送请求的URL和IP,以便在收到请求时进行验证。我对此的关注是外部应用程序的可移植性,即应用程序被移动到具有不同IP的新服务器,现在它不起作用。
  6. 我在2中遇到的问题很少,或许,我的思绪可能无法自我解决。首先,不是应该保密的应用秘密吗?那么,如果一个javascript客户端提出请求并不会影响应用程序密钥的保密性呢?为什么有一个应用秘密然后我可以通过验证应用密钥,现时值和服务器IP验证请求身份?我知道像php,ruby或c#.net这样的服务器端语言不会暴露这个秘密,但我希望这对JS和编译语言来说都是普遍安全的。

    最后,Facebook有一个developer security checklist告诉开发人员“永远不要在客户端或可编译代码中包含你的App Secret”,#34;这会向我建议加密的web.config等。此解决方案不适用于将REST服务暴露给通过javascript消费的任何人。

    我梳理的其他主题:
      http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
      https://developers.facebook.com/docs/facebook-login/security/
      Best Practices for securing a REST API / web service
      Security of REST authentication schemes
      HTTP Basic Authentication instead of TLS client certification
      RESTful Authentication

1 个答案:

答案 0 :(得分:0)

我保护我的应用程序的方式是使用OpenID Connect。对于您的示例,您在#2中讨论的客户端将是RP(资源提供商),而像Google这样的身份验证系统将是您的OP(OpenID提供商)

  

客户端必须提供应用密钥/密钥才能验证他们是谁。

实际上是您的应用程序,您的客户端机密不会让您的服务器超出您的/etc/passwd文件。这个秘密就是RP用来与OP通信以获取数据的秘密。

简而言之就是

  1. 用户连接到您的API端点,例如/restapi
  2. 您的终端会将用户重定向到您已注册应用程序的Google
  3. 用户登录OP(例如Google)并获取传递给RP的代码
  4. RP将转到OP获取openid信息,例如电子邮件
  5. RP将使用该openid信息查找自己的授权表
  6. 一旦RP验证用户RP的授权,将提供其余信息。