使用 Apache CXF 和 OAuth 2.0 保护 JAX-RS
Posted
技术标签:
【中文标题】使用 Apache CXF 和 OAuth 2.0 保护 JAX-RS【英文标题】:Securing JAX-RS with Apache CXF and OAuth 2.0 【发布时间】:2014-03-10 17:04:38 【问题描述】:我想在我的 JAX-RS RESTful 服务上实施 OAuth 2.0 授权。
经过一些研究,我发现 Apache CXF 可以做到这一点。但是,我还没有找到任何关于它的例子,这对我来说还不清楚。在哪里可以找到一些带有 OAuth 2.0 的 JAX-RS 示例?
【问题讨论】:
你有没有找到这个问题的任何好的解决方案,或者你是否尝试过开发你自己的 cxf-auth2?如果是这样,请发布答案..我正在等待.. @MohasinAli 我已经意识到 OAuth 2.0 对于我的要求来说太复杂了。所以最终得到了我在this answer 中描述的基于令牌的身份验证。 @MohasinAli 在我的研究过程中,我发现了Apache Oltu,它是 Java 中 OAuth 的实现。 嗨,我在上面的帖子中看到了你的回答。很好,我还有一个疑问,如果您能澄清这一点,我将不胜感激,如果恶意用户使用调试器控制台 (document.cookie="name=value" ) 通过窃取其他访问权限来修改 cookie 中的访问令牌令牌(比如恶意用户访问别人的电脑,打开浏览器看到访问令牌,然后在自己电脑的浏览器中复制别人的访问令牌),你怎么能在服务器端避免这种黑客攻击? 我想给你 50 个赏金,在下面添加你的答案链接作为答案。 【参考方案1】:免责声明:此答案并未真正提供使用 OAuth 2.0 保护 JAX-RS 的解决方案。但它旨在为 Mohasin Ali 提供一些见解,他开始对我的问题进行赏金。也许,我使用的解决方案对他有用。
关于赏金:
这个问题广泛适用于大量受众。需要详细的规范答案来解决所有问题。
在不久前提出这个问题后,我意识到 OAuth 2.0 对于我的要求来说太复杂了。即使Basic Authentication 也足以满足我的要求。但我最终使用了基于在服务器端签名的JWT 令牌的身份验证方案。我在answer 中描述了我的解决方案。
Apache CXF provides an implementation of OAuth 2.0。如果您想使用 OAuth 来保护您的 API,它可能值得一看。 Apache CXF also supports OAuth 1.0.
无论您决定使用哪种身份验证方法,都可以在 HTTPS 连接之上进行。你需要一个证书。作为建议,请查看Let's Encrypt。他们声称是一个免费、自动化和开放的证书颁发机构,目前由 Mozilla、Akamai、Cisco、Chrome、Facebook 等赞助。
关于以下情况,提到in the comments:
[...] 恶意用户访问某人的计算机,打开浏览器,查看访问令牌并将访问令牌复制到自己的浏览器 [...]
如果恶意用户可以物理访问计算机,HTTPS 不会阻止该恶意用户从某人的计算机上窃取身份验证令牌。实际上,如果发生这种情况,我认为您应该有更大的担忧……
为了增加一层安全性,您可以考虑将令牌与您为其颁发令牌的用户的 IP 地址一起存储。对于到达您的 API 的每个请求,将传入请求的 IP 与您为其颁发令牌的用户的 IP 进行比较。如果 IP 不匹配,则拒绝请求。
如果您使用 JWT 令牌,而不是存储整个令牌,只存储 JWT ID claim (jti
)。只需确保此值是唯一的(java.util.UUID
应该足以生成 jti
值)。
对于完全无状态的身份验证(不存储整个令牌也不存储令牌 ID),您可以将 IP 地址存储在 JWT 令牌声明中,但请注意令牌会长几个字节。
【讨论】:
【参考方案2】:请参阅https://github.com/Talend/tesb-rt-se/tree/master/examples/cxf/jaxrs-oauth2 示例,它有一个并置示例(同一容器中的所有端点)和一个更复杂的示例,端点分布,SAML SSO Web 配置文件支持 SSO。
【讨论】:
示例 github.com/Talend/tesb-rt-se/tree/master/examples/cxf/… 已在 master 分支中删除,但仍存在于旧分支/标签中,例如 "release/6.4.0.M0" github.com/Talend/tesb-rt-se/tree/release/6.4.0M0/examples/cxf/…以上是关于使用 Apache CXF 和 OAuth 2.0 保护 JAX-RS的主要内容,如果未能解决你的问题,请参考以下文章
java:JAXWS 2.0 不支持 Rpc/编码的 wsdls