如何使用 oAuth 2.0 保护 apache cxf webservice(jax-ws)

Posted

技术标签:

【中文标题】如何使用 oAuth 2.0 保护 apache cxf webservice(jax-ws)【英文标题】:how to secure apache cxf webservice(jax-ws) using oAuth 2.0 【发布时间】:2012-08-30 04:37:15 【问题描述】:

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

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

原教程链接:

JAX-RS: OAuth2

【问题讨论】:

在标题上你写了 JAX-WS(SOAP Web 服务)但是链接指向 JAX-RS(REST 服务),我认为你没有找对地方 【参考方案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 对于使用原始凭据集(协议的目标)访问 3rd 方应用程序非常有用。但除非您需要这样做,否则无需(再次 IMO)实施完整的 oAuth。如果您只想保护您的 API,只需使用 SSL 和密钥或用户名/密码组合即可。


另见:

Application Authentication With JAX-WS CFX User Guide How is OAuth 2 different from OAuth 1? Designing a Secure REST API without oAuth - 对一般理解更有用

【讨论】:

【参考方案2】:

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

基本上它将与通过授权标头传递的不记名令牌一起工作,并且可以轻松定制以处理 WS-Security 二进制令牌

【讨论】:

以上是关于如何使用 oAuth 2.0 保护 apache cxf webservice(jax-ws)的主要内容,如果未能解决你的问题,请参考以下文章

如何保护 Oauth 2.0 客户端 ID 和客户端密码

使用 Oauth 2.0 保护 API

使用 oAuth 2.0 保护基于 Jersey 的 REST 服务

构建微服务-使用OAuth 2.0保护API接口

如何在 Azure 逻辑应用中使用 OAuth 2.0 身份验证?

使用oauth 2.0中的指纹登录