Вставка токена имени пользователя в заголовок безопасности уже созданного конверта SOAP дает мне два заголовка!
Я использую WSS4J для добавления токена имени пользователя в заголовок уже сформированного конверта запроса SOAP.
Вот как выглядит SOAP-запрос:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://sample03.samples.rampart.apache.org/xsd">
<soapenv:Header/>
<soapenv:Body>
<xsd:echo>
<xsd:param0>hurro kitty</xsd:param0>
</xsd:echo>
</soapenv:Body></soapenv:Envelope>
Это мой код (строка, запрос, запрос выше):
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
InputSource inStream = new InputSource();
inStream.setCharacterStream(new StringReader(request));
Document document = builder.parse(inStream);
WSSecUsernameToken usernametoken = new WSSecUsernameToken();
usernametoken.setPasswordType(WSConstants.PASSWORD_TEXT);
usernametoken.setUserInfo(username, password);
WSSecHeader secHeader = new WSSecHeader("", false);
secHeader.insertSecurityHeader(document);
usernametoken.build(document, secHeader);
Это мой результат (обратите внимание, что заголовок, который был вставлен, не имеет правильного пространства имен, а также есть два заголовка):
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://sample03.samples.rampart.apache.org/xsd">
<Header>
<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-2765109" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>bob</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">bobPW</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</Header>
<soapenv:Header/>
<soapenv:Body>
<xsd:echo>
<xsd:param0>hurro kitty</xsd:param0>
</xsd:echo>
</soapenv:Body></soapenv:Envelope>
Что я делаю неправильно?
1 ответ
Решение
Что я делаю неправильно?
Когда вы создаете исходный XML, вам нужно убедиться, что DocumentBuilderFactory поддерживает пространство имен. WSSecurity пытается найти заголовок soap по пространству имен soap, но он недоступен. Добавление следующей строки должно исправить это:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
...