在设计REST API或服务时,是否有处理安全性(身份验证、授权、身份管理)的最佳实践?

在构建SOAPAPI时,您可以将WS-Security作为指南,并且有许多关于该主题的文献。我发现关于保护REST端点的信息较少。

虽然我理解REST故意没有类似于WS-*的规范,但我希望已经出现了最佳实践或推荐的模式。

如有任何讨论或相关文件的链接,我们将不胜感激。如果重要的话,我们将使用WCF和POX/JSON序列化消息,用于使用.NET Framework v3.5构建的REST API/服务。


当前回答

我遇到过的关于REST安全性的最好的帖子之一是1 RainDrop。MySpace API也使用OAuth进行安全保护,您可以完全访问RestChess代码中的自定义频道,我对此进行了大量探索。这是在Mix演示的,你可以在这里找到帖子。

其他回答

REST本身没有提供安全标准,但OAuth和SAML等东西正在迅速成为这个领域的标准。然而,身份验证和授权只是您需要考虑的一小部分。与web应用程序相关的许多已知漏洞非常适用于REST API。你必须考虑输入验证、会话破解、不适当的错误消息、内部员工漏洞等等。这是一个很大的问题。

因为@Nathan最后得到了一个简单的HTTP Header,有些人说OAuth2和客户端SSL证书。其要点是。。。您的RESTAPI不应该处理安全性,因为这确实超出了API的范围。

相反,无论是web代理后面的HTTP头(一种常见的方法,如SiteMinder、Zermatt甚至Apache HTTPd),还是像OAuth 2一样复杂,都应该在其上面设置一个安全层。

关键是请求应该在没有任何最终用户交互的情况下工作。所需要的就是确保与RESTAPI的连接经过身份验证。在JavaEE中,我们有一个userPrincipal的概念,它可以在HttpServletRequest上获得。它也在部署描述符中管理,URL模式可以是安全的,因此RESTAPI代码不再需要检查。

在WCF世界中,我将使用ServiceSecurityContext.Current获取当前安全上下文。您需要将应用程序配置为需要身份验证。

我上面的声明有一个例外,那就是使用随机数来防止重放(可能是攻击,也可能是某人提交了两次相同的数据)。该部分只能在应用程序层中处理。

我有点惊讶的是,还没有提到带有客户端证书的SSL。当然,只有当您能够依靠证书识别用户群体时,这种方法才真正有用。但许多政府/公司确实向其用户发放了这些证书。用户不必担心创建另一个用户名/密码组合,并且在每个连接上都建立了身份,因此与服务器的通信可以完全无状态,不需要用户会话。(并非意味着所提及的任何/所有其他解决方案都需要会议)

这已经有一段时间了,但这个问题仍然相关,尽管答案可能有点改变。

API网关将是一个灵活且高度可配置的解决方案。我测试并使用了KONG,非常喜欢我所看到的。KONG提供了自己的管理REST API,您可以使用它来管理用户。

Express-gateway.io是最新的,也是一个API网关。

我搜索了很多关于restful ws安全性的信息,最后我们通过cookie在客户端到服务器之间使用令牌来验证请求。我使用spring安全性来授权服务中的请求,因为我必须根据DB中已经存在的指定安全策略来验证和授权每个请求。