我尝试使用Apache CXF(版本2.7.12)实现OAuth 2.0的客户端凭据流以保护RESTful服务。
我唯一的客户(现在)将被信任以保密密钥和秘密 - 我知道周围的考虑因素。
我的问题是如何将客户端密钥存储在授权服务器上。在我看来,客户的秘密'实际上是一个密码,因此应该加盐和散列。但是,CXF的AccessTokenService,它在存储的秘密和请求中传入的值之间进行比较,只进行String.equals()比较,并且似乎没有给我任何钩子我可以提供不同的机制。
这意味着我需要以纯文本格式存储客户端密钥,以便将其与请求中的纯文本值进行比较,而不会有轻微的hacky替代。
我是否遗漏了一些明显的功能,可以让我在比较之前对输入值进行哈希处理,还是我对客户端密钥过于谨慎?也许我把它当作密码来对待它?
答案 0 :(得分:0)
对于将来遇到这个问题的人来说,这是一种答案。
我的方法是创建一个非常简单的过滤器(如此处所述:http://cxf.apache.org/docs/jax-rs-filters.html),它手动创建一个SecurityContext(https://cxf.apache.org/javadoc/latest/org/apache/cxf/security/SecurityContext.html),并在消息通过过滤器时将其添加到Message中。
这意味着当流程继续到CXF的AccessTokenService时,它被识别为已经过身份验证。
我还在CXF邮件列表上提出了一个问题,得到了开发人员的快速回复,同意他最近注意到这是一个潜在的问题,并且正在研究它。几个小时之内,他就做出了一个改变,解决了它,看起来它本来是一个理想的解决方案。不幸的是,我还没有时间去测试它,因为我的解决方案有效并且给了我一些额外的灵活性,这对我项目的其他要求很有帮助。