我已使用Apache CXF
在Tomcat中部署了webservice。如何使用OAuth 2.0
继续保护该Web服务?
我已经浏览了以下网址但未找到任何合适的解决方案。关于如何为简单的Web服务实现oAuth 2.0
的工作示例或教程?
原始教程链接:
答案 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二进制令牌