2014-10-31 77 views
2

我正在尝试使用Apache CXF(版本2.7.12)实现OAuth 2.0的客户端凭证流以保护REST风格的服务。散列客户端凭据的客户端机密在Apache CXF中的OAuth 2流

我唯一的客户(现在)将被信任保留密钥和机密 - 我意识到这一点的考虑。

我的问题是我应该如何在授权服务器上存储客户端密钥。在我看来,'客户秘密'实际上是一个密码,因此应该被淹没和散列。但是,CXF的AccessTokenService只对String.equals()进行比较,并且在存储的秘密和传入的值之间进行比较,似乎并没有给出任何提供不同机制的钩子。

这意味着我将需要以纯文本格式存储客户机密码,以便将其与请求中的纯文本值进行比较,而不会有一些小问题。

我是否缺少一些明显的功能,让我在比较之前对传入值进行哈希处理,或者我对客户端密码过于谨慎?也许我错了把它当作密码来对待?

回答

0

对于将来遇到这个问题的人来说,这是一种排序的答案。

我的方法是创建一个非常简单的过滤器(如此处所述:http://cxf.apache.org/docs/jax-rs-filters.html),手动创建SecurityContext(https://cxf.apache.org/javadoc/latest/org/apache/cxf/security/SecurityContext.html),并在消息通过过滤器时将其添加到消息中。

这意味着,当流程继续到CXF的AccessTokenService时,它被识别为已经被认证。

我还在CXF邮件列表上提出了一个问题,并得到了开发人员的一个非常及时的答复,他同意他最近已经注意到这是一个潜在的问题,并正在研究它。在几个小时内,他做出了一个改变来解决这个问题,看起来这将是一个理想的解决方案。不幸的是,我还没有时间去测试它,因为我的解决方案很有用,并且给了我一些额外的灵活性,这对我的项目的其他需求很有帮助。