Java Spring Web 服务 SOAP 身份验证
Java Spring Webservices SOAP Authentication
我正在使用 java spring 网络服务向服务器发送 soap 请求。但是我从服务器收到一条错误消息
The security context token is expired or is not valid
然后我向 SOAP headers 添加了身份验证,导致请求 xml 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<UsernameToken>
<Username>XXXXXXXX</Username>
<Password>XXXXXXXX</Password>
</UsernameToken>
</Security>
</env:Header>
<env:Body>
The body is in the correct format here
</env:Body>
</env:Envelope>
但我仍然遇到该错误。据我了解,客户端向服务器发送身份验证凭据,服务器发回 requestToken,用于保持客户端和服务器之间的连接,然后客户端使用从服务器接收到的令牌可以进行任何其他 API 调用例如登录、购买、出售(或 API 中提到的任何内容)
我的假设是否正确?如果是,如何使用 Java Spring WebServices 来实现。我是否需要在客户端生成像 BinarySecret 这样的字段并将其打包在 RequestSecurityContext 下?
为了添加 SOAP headers,我写了一个 class,它实现了 WebServiceMessageCallback 并覆盖了 doWithMessage 方法,并在其中写入 headers 用于用户名和密码(即安全性)
如有任何帮助,我们将不胜感激!谢谢!
经过 2 天的摸索,我找到了解决方案!
1) 使用 CXF wsdl2java
从 wsdl 生成 classes
2) 确保在 pom 文件中指向正确的 wsdlLocation
3) 从生成的服务 class 获取存根并注入提供的用户名和密码,然后它应该可以工作。像这样:
final YourService service = new YourService();
final YourStub stub = service.getService();
final Map ctx = ((BindingProvider)stub).getRequestContext();
ctx.put("ws-security.username", userName);
ctx.put("ws-security.password", password);
stub.callYourMethod();
PS:请确保您拥有正确的库,我只是使用了 cxf-bundle 而没有使用 cxf 中的其他任何东西,它起作用了!早些时候它不起作用,因为我单独包含了来自 cxf 的库。
我正在使用 java spring 网络服务向服务器发送 soap 请求。但是我从服务器收到一条错误消息
The security context token is expired or is not valid
然后我向 SOAP headers 添加了身份验证,导致请求 xml 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
<env:Header>
<Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<UsernameToken>
<Username>XXXXXXXX</Username>
<Password>XXXXXXXX</Password>
</UsernameToken>
</Security>
</env:Header>
<env:Body>
The body is in the correct format here
</env:Body>
</env:Envelope>
但我仍然遇到该错误。据我了解,客户端向服务器发送身份验证凭据,服务器发回 requestToken,用于保持客户端和服务器之间的连接,然后客户端使用从服务器接收到的令牌可以进行任何其他 API 调用例如登录、购买、出售(或 API 中提到的任何内容)
我的假设是否正确?如果是,如何使用 Java Spring WebServices 来实现。我是否需要在客户端生成像 BinarySecret 这样的字段并将其打包在 RequestSecurityContext 下?
为了添加 SOAP headers,我写了一个 class,它实现了 WebServiceMessageCallback 并覆盖了 doWithMessage 方法,并在其中写入 headers 用于用户名和密码(即安全性)
如有任何帮助,我们将不胜感激!谢谢!
经过 2 天的摸索,我找到了解决方案!
1) 使用 CXF wsdl2java
从 wsdl 生成 classes2) 确保在 pom 文件中指向正确的 wsdlLocation
3) 从生成的服务 class 获取存根并注入提供的用户名和密码,然后它应该可以工作。像这样:
final YourService service = new YourService();
final YourStub stub = service.getService();
final Map ctx = ((BindingProvider)stub).getRequestContext();
ctx.put("ws-security.username", userName);
ctx.put("ws-security.password", password);
stub.callYourMethod();
PS:请确保您拥有正确的库,我只是使用了 cxf-bundle 而没有使用 cxf 中的其他任何东西,它起作用了!早些时候它不起作用,因为我单独包含了来自 cxf 的库。