Java REST API后端的Web应用程序身份验证

Java REST API后端的Web应用程序身份验证,java,security,rest,jersey,hmac,Java,Security,Rest,Jersey,Hmac,我目前正在创建一个在后端(Java,特别是Jersey v1.18)使用REST API的web应用程序(HTML5、JS等)的早期阶段。将要存储的数据的性质是高度敏感的,所以我已经开始关注安全性,即使应用程序只是处于早期阶段。最终的目标将是拥有本地移动应用程序,并可能通过相同的API为外部客户端提供对数据的访问 到目前为止,在我的研究中,我已经确定了各种身份验证方法,包括HTTP Basic、基于令牌、会话cookie、OAuth、HMAC等。这里的关键组件是REST API主要由用户访问,而

我目前正在创建一个在后端(Java,特别是Jersey v1.18)使用REST API的web应用程序(HTML5、JS等)的早期阶段。将要存储的数据的性质是高度敏感的,所以我已经开始关注安全性,即使应用程序只是处于早期阶段。最终的目标将是拥有本地移动应用程序,并可能通过相同的API为外部客户端提供对数据的访问

到目前为止,在我的研究中,我已经确定了各种身份验证方法,包括HTTP Basic、基于令牌、会话cookie、OAuth、HMAC等。这里的关键组件是REST API主要由用户访问,而不是由其他应用程序或后端访问。因此,拥有一个“登录/注销”等价物很重要,这可以归结为用户级身份验证

到目前为止,HMAC身份验证看起来是最有希望的,因为我们目前还没有计划与任何OAuth提供商集成

我已经阅读了几十篇SO帖子,以及以下文章: (注意:这显然是不好的,因为不建议使用用户名腌制)

理想情况下,HMAC似乎是一条可行之路,但我还没有看到处理共享秘密的推荐方法。使用一个资源来验证凭证,然后提供一个令牌/nonce与HMAC方案一起使用,这似乎是一个选项,但我质疑仅将此令牌/nonce严格用作令牌的优势


我知道已经详细讨论了REST API的HMAC身份验证,但当与用户期望的身份验证细节(用户名、电子邮件、密码等)结合使用时,是否有不需要预共享密钥的推荐方法?

这主要是一个基于意见的问题,但我会拿出我的两分钱:去吃一块饼干

如果您的主要受众是人类,并且您不需要与第三方集成,那么不要为OAuth操心。只需确保您的API仅通过HTTPS可用,并发出一个会话令牌,服务器可以在登录后撤销该令牌。严格地说,它不需要是饼干;我见过一些API,它们将令牌存储在HTML5会话存储中,并将其提供在授权头中或作为查询参数


如果SSL设置正确,您的用户将在浏览器中获得预期的挂锁,并且您将不会受到您和客户端之间任何人的攻击。如果客户受到威胁,你就完蛋了。而且,由于客户无法保守秘密,因此更复杂的HMAC方案没有太多优势。

您是否推荐任何适用于Jersey的框架?我研究了ApacheShiro、Spring Security、ApacheOLTU,并将HTTP基本身份验证作为Jersey的一部分。只需首先将对已验证端点的请求发送到过滤器,如果没有令牌,则使用401拒绝。显然,如果您有特定于域的授权逻辑,您仍然需要根据每个资源处理该逻辑。