如何使用oAuth 2.0保护apache cxf web服务(jax-ws)

时间:2012-09-05 12:46:49

标签: web-services apache oauth-2.0 cxf

我已使用Apache CXF在Tomcat中部署了webservice。如何使用OAuth 2.0继续保护该Web服务?

我已经浏览了以下网址但未找到任何合适的解决方案。关于如何为简单的Web服务实现oAuth 2.0的工作示例或教程?

原始教程链接:

2 个答案:

答案 0 :(得分:1)

我最近遇到了同样的问题。经过大量的研究,我发现(这可能仅限于我),这是非常复杂的。

可以通过以下方式将所需的“授权标头”附加到SOAP Web服务调用:

Map<String, Object> req_ctx = ((BindingProvider)port).getRequestContext();
req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WS_URL);

Map<String, List<String>> headers = new HashMap<String, List<String>>();
headers.put("key", Collections.singletonList("yourkey"));
//... all other parameters required.
req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers);

然后可以在服务器端检查请求:

MessageContext mctx = wsctx.getMessageContext();

//get detail from request headers
    Map http_headers = (Map) mctx.get(MessageContext.HTTP_REQUEST_HEADERS);
    List userList = (List) http_headers.get("key");
//... get other information required here

因此您可以验证请求。


旁注

值得注意的是,根据我的发现,oAuth2对于简单地保护您的API并不是非常有用 - 只是保护它免受外部使用。

推理

使用oAuth 1,您可以使用身份验证通过其密钥验证用户。您知道他们已获得授权,因为他们已成功签署了请求,因此您可以允许他们访问该信息。

使用oAuth 2,协议要求您使用HTTPS。那么为什么不在您的API上使用应用程序身份验证?我发现oAuth 2对于使用原始凭证集(协议的目标)访问第三方应用程序非常有用。但除非你需要这样做,否则(再次IMO)不需要实现完整的oAuth。如果您只想保护您的API,只需使用SSL和密钥或用户名/密码组合即可。


另见:

答案 1 :(得分:1)

我在这里添加了一个简短的介绍: https://cwiki.apache.org/confluence/display/CXF20DOC/JAX-RS+OAuth2#JAX-RSOAuth2-OAuth2tokensandSOAPendpoints

基本上它可以与通过授权头传递的承载令牌一起使用,并且可以轻松定制以处理WS-Security二进制令牌