Как создать клиент веб-службы ColdFusion, использующий WS-Security?
-
03-07-2019 - |
Вопрос
Я реализовал в нашем продукте несколько веб-сервисов с использованием Java и WS-Security.Один из наших клиентов хочет использовать веб-сервис с помощью ColdFusion.Поддерживает ли ColdFusion WS-Security?Могу ли я обойти это, написав клиент Java и используя его в ColdFusion?
(Я мало что знаю о ColdFusion).
Решение
Я предполагаю, что вы имеете в виду, что вам нужно передать безопасность как часть заголовка SOAP. Вот пример того, как подключиться к службе .Net. Тот же подход должен применяться с Java, только URL будут другими.
<cfset local.soapHeader = xmlNew()>
<cfset local.soapHeader.TheSoapHeader = xmlElemNew(local.soapHeader, "http://someurl.com/", "TheSoapHeader")>
<cfset local.soapHeader.TheSoapHeader.UserName.XmlText = "foo">
<cfset local.soapHeader.TheSoapHeader.UserName.XmlAttributes["xsi:type"] = "xsd:string">
<cfset local.soapHeader.TheSoapHeader = xmlElemNew(local.soapHeader, "http://webserviceUrl.com/", "TheSoapHeader")>
<cfset local.soapHeader.TheSoapHeader.Password.XmlText = "bar">
<cfset local.soapHeader.TheSoapHeader.Password.XmlAttributes["xsi:type"] = "xsd:string">
<cfset theWebService = createObject("webservice","http://webserviceUrl.com/Webservice.asmx?WSDL")>
<cfset addSOAPRequestHeader(theWebService, "ignoredNameSpace", "ignoredName", local.soapHeader, false)>
<cfset aResponse = theWebService.SomeMethod(arg1)>
Надеюсь, это то, что вам нужно.
Другие советы
Это, вероятно, более правильно для получения «простого» заголовка мыла xml. В приведенном выше примере пропущено несколько строк.
Local['soapHeader'] = xmlNew();
Local['soapHeader']['UsernameToken'] = xmlElemNew(local.soapHeader, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "UsernameToken");
Local['soapHeader']['UsernameToken']['username'] = xmlElemNew(local.soapHeader, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "username");
Local['soapHeader']['UsernameToken']['username'].XmlText = Arguments.szUserName;
Local['soapHeader']['UsernameToken']['username'].XmlAttributes["xsi:type"] = "xsd:string";
Local['soapHeader']['UsernameToken']['password'] = xmlElemNew(local.soapHeader, "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "password");
Local['soapHeader']['UsernameToken']['password'].XmlText = Arguments.szPassword;
Local['soapHeader']['UsernameToken']['password'].XmlAttributes["xsi:type"] = "xsd:string";
addSOAPRequestHeader(ws, "ignoredNameSpace", "ignoredName", Local.soapHeader, false);
Я никогда не делал ws-security и не знаю, может ли ColdFusion его использовать или нет, но я отвечу на ваш второстепенный вопрос:
Могу ли я обойти это, написав Java-клиент и используя его в Coldfusion?
Да, абсолютно. ColdFusion может легко использовать объекты и методы Java.
Я сам некоторое время изучаю WS-Secuirty и ColdFusion и могу с уверенностью сказать, что приведенный выше пример не является реализацией WS-Security.Несмотря на то, что имя пользователя и пароль отправляются в заголовке, они отправляются в виде открытого текста.Использование SSL поможет, но WS-Security — это гораздо больше работы, чем простое применение этого кода.ColdFusion изначально не поддерживает WS-Security, но может легко использовать объекты и методы Java.Существует пакет Apache под названием WSS4J, который предоставляет средства реализации WS-Security на Java.Вы можете написать оболочку и затем использовать ее в ColdFusion.Мне лично удалось это сделать, однако необходимо внести небольшие изменения в конфигурацию на стороне ColdFusion, с чем у меня возникли некоторые проблемы.
Если кто-нибудь может мне помочь с настройкой, я буду очень признателен.
Дмитрий