代码之家  ›  专栏  ›  技术社区  ›  Ujjwal Gulecha

Java Spring Webservices SOAP身份验证

  •  0
  • Ujjwal Gulecha  · 技术社区  · 7 年前

    我正在使用java spring webservice向服务器发送soap请求。然而,我从服务器上得到一个错误

    The security context token is expired or is not valid
    

    因此,我在SOAP头中添加了身份验证,生成了如下请求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头,我编写了一个类,该类实现WebServiceMessageCallback并重写doWithMessage方法,并在其中写入用户名和密码的头(即安全性)

    任何帮助都将不胜感激!非常感谢。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Ujjwal Gulecha    7 年前

    因此,经过两天的探索,我终于找到了解决方案!

    1) 使用CXF wsdl2java从wsdl生成类

    2) 确保在pom文件中指向正确的wsdlLocation

    3) 从生成的服务类中获取存根,并插入提供的用户名和密码,然后它就可以工作了。类似这样:

    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捆绑包,没有使用cxf中的其他任何东西,它工作正常!早些时候,它不起作用,因为我单独包含了来自cxf的库。