2014-01-30 185 views
2

我想为我的Web应用程序开发RESTful API。客户必须清楚JS + HTML,并且用户必须以某种方式在系统中进行身份验证。我读过几篇关于安全性和RESTful API的文章,但有些观点仍然不清楚。正如我在第一步所理解的,用户必须提供他的凭据给服务器。在该服务器必须验证用户证书并且它们是否有效之后,将一些编码的令牌发送给用户(假设它将是[用户密钥]:[用户IP]:[令牌创建时间])。用户认证客户端必须在每次调用API时发送此密钥。这就是我了解RESTful API身份验证原理的方式。RESTful API安全

有了这样的解决方案,我假设令牌可以被盗,另一个用户可以访问安全的用户数据(即使IP包含在访问令牌中,每个请求都会有验证)。为此,我计划包括令牌创建时间,但正如我理解的这样的解决方案,我必须在每次过期时更新访问令牌 - 在这种情况下,我不清楚如何实现“记住我”功能。

我不清楚如何为我的RESTful API实现100%安全认证。也许我错过了一些东西。或者,也许我对认证principes的理解是错误的。

回答

2

这取决于您正在使用的身份验证方案。例如,在ASP.NET MVC + REST中使用基本身份验证进行处理时,它将为您生成令牌,该令牌实际上是Base64编码的字符串“{用户名}:{密码}”。而且你是对的,它可能被盗,这就是为什么基本认证HTTPS是必须的,因为令牌用Basic模式抛出认证头。

对于REST安全性,最合适和最安全的是OpenId和OAuth。只是不要重新发明轮子并使用已有的标准。与OpenID相比,OAuth不仅包含身份验证,还包含授权。 OAuth已经用令牌更新和令牌创建时间等描述了所有的细微差别。

现在实际如何在REST中实现OAuth。首先阅读标准。对于你的案例阅读Implicit Grant flow,因为标准有不同的客户端具有不同的信任级别和安全性的多个流程。

http://tools.ietf.org/html/rfc6749

之后,你可以尝试在技术堆栈的一些已经实施库您使用的是Java或.NET。对于客户端来说,使用库进行比较并不重要,但对于服务器实施而言,

关于潜在的安全问题,请阅读http://tools.ietf.org/html/rfc6749#section-10

Some think that OAuth 2.0 is less secure that OAuth 1.0,它也依赖于令牌格式。无论如何,访问令牌应该通过HTTP头传递,并通过HTTPS以及clientid应该存储并通过安全。