我想在我的JAX-RS RESTful服务上实现OAuth 2.0授权。
经过一些研究,我发现Apache CXF可以做到这一点。但是,我没有找到任何关于它的例子,对我来说还不清楚。我在哪里可以找到一些带有OAuth 2.0的JAX-RS的例子?
答案 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 claim(jti
)。只需确保此值是唯一的(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。