使用Apache CXF和OAuth 2.0保护JAX-RS

时间:2014-02-12 11:34:33

标签: java oauth-2.0 cxf jax-rs

我想在我的JAX-RS RESTful服务上实现OAuth 2.0授权。

经过一些研究,我发现Apache CXF可以做到这一点。但是,我没有找到任何关于它的例子,对我来说还不清楚。我在哪里可以找到一些带有OAuth 2.0的JAX-RS的例子?

2 个答案:

答案 0 :(得分:5)

免责声明:此答案并未真正提供使用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,思科,Chrome,Facebook和其他机构赞助。

关于以下情况,提及in the comments

  

[...]恶意用户访问某人的计算机,打开浏览器,查看访问令牌并将访问令牌复制到自己的浏览器[...]

如果恶意用户具有对计算机的物理访问权限,则HTTPS不会阻止此恶意用户从某人的计算机窃取身份验证令牌。实际上,如果它发生了,我认为你应该有更大的顾虑......

对于额外的安全层,您可以考虑将令牌与您为其颁发令牌的用户的IP地址一起存储。对于每次访问API的请求,请将传入请求的IP与您为其颁发令牌的用户的IP进行比较。如果IP不匹配,请拒绝该请求。

如果您使用JWT令牌,而不是存储整个令牌,则只存储JWT ID claimjti)。只需确保此值是唯一的(java.util.UUID应足以生成jti值。)

对于完全无状态的身份验证(不存储整个令牌既不存储令牌ID),您可以将IP地址存储在JWT令牌声明中,但请注意令牌将长几个字节。

答案 1 :(得分:3)

请参阅https://github.com/Talend/tesb-rt-se/tree/master/examples/cxf/jaxrs-oauth2以获取一个示例,它有一个并置的示例(所有端点位于同一容器中)和更复杂的端点,其中分发了端点,SAML SSO Web配置文件支持SSO。