访问 RESTful Web 服务的最佳身份验证机制

Posted

技术标签:

【中文标题】访问 RESTful Web 服务的最佳身份验证机制【英文标题】:Best authentication mechanism to access RESTful webservices 【发布时间】:2016-02-29 21:10:10 【问题描述】:

我正在设计 3rd 方将使用的 RESTful Web 服务。他们需要经过身份验证才能使用我的 Restful 服务。为此,我计划使用两种方法来对它们进行身份验证。

    使用另一个 Restful 服务作为代理访问 Restful 服务: 要访问 RESTful 服务,用户将通过 POST 方法将用户名和密码发送到此代理类。当用户名和密码正确时,将生成一个唯一的 id(例如,身份验证密钥)并在响应中发送。当下一个发出请求,用户将在请求负载中发送认证密钥(以及访问目标 Restful 服务的其他详细信息)。此认证密钥将由代理验证。如果密钥有效,代理将调用目标 Restful服务并将响应返回给客户端。否则将在响应中发送错误消息。

    基于 Servlet 的身份验证: 与第一种方法相同,但 servlet 将充当访问 Web 服务的代理。在这种方法中,用户名和密码将由 servlet 验证,如果正确,则 servlet 将在响应中设置一些 cookie 并将其发送给客户端。下一步验证用户发送请求 cookie 的时间。如果有效,则 servlet 将调用 Restful 服务并发送响应。但我不确定用户请求是否包含 cookie。

在第一种方法中,用户需要为每个请求发送身份验证密钥。 但在第二种方法中则不需要。

我需要知道哪种方法更好?..还有其他处理方法..

【问题讨论】:

How to secure RESTful web services?的可能重复 【参考方案1】:

老实说,我不是 servlet 或 Java 方面的专家,我知道如何用 Java 做很多事情,但这不是我的主要环境。不过,我确实对安全性特别是 REST 了解很多。

您的第一种方法是经典方法,它不需要代理。它确实工作得很好,但你可以在没有代理服务的情况下简化它。

第二个不推荐。有几篇文章指出了基于 cookie 的解决方案中的许多问题。事实上,它们更容易被冒充并获得非法访问。无论如何,您永远不会发送 cookie,您肯定会发送包含 cookie 某些信息的标头。请记住,您总是使用这些机制以某种方式发送授权信息。无论您如何操作以及对客户端是否透明,授权都必须通过,因为 REST 的主要原则是无状态:

对 Api 的每个请求都是在完全隔离的情况下发生的。 ... 哄服务器进入到达页面的状态是不正确的

向我的团队引用我自己的话。

就使用一种非常知名的方法而言,我会使用广泛使用的 OAuth 2.0。该概念类似于您作为安全协商结果发出不记名令牌的方法:

http://self-issued.info/docs/draft-ietf-oauth-v2-bearer.html

令牌本身包含大量信息,并且有几篇关于您可能暴露的敏感信息的文章。

一种更好的机制是使用公钥密码术,服务器可以发出一个签名消息,您可以使用公钥进行验证,但这种方法超出了我们在一个小答案中可以解决的范围。

这始终取决于您的服务的敏感程度,始终需要在确保服务的安全性以及可以花费多少资源和时间方面进行权衡。

【讨论】:

以上是关于访问 RESTful Web 服务的最佳身份验证机制的主要内容,如果未能解决你的问题,请参考以下文章

ASP.net Web API RESTful Web 服务 + 基本身份验证

Web服务器上的RESTful身份验证

RESTful Web 服务中的身份验证

使用 Apache Shiro 的 Restful Web 服务身份验证和授权

RESTful Web 服务认证

如何只允许经过身份验证(登录)的用户访问 Spring RESTful 服务