1. Через передачу GET параметров. Выглядит ужасно и есть ощущение, что это несекурно даже через https.
2. Используя стандартный WS-Security. На ней и остановимся поподробнее.
Для аутентификации с использованием WS-Security нужно в заголовке SOAP передавать аутентификационные данные. Выглядит это таким образом:
<wsse:security xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/04/secext">
<wsse:usernametoken>
<wsse:username>user</wsse:username>
<wsse:password type="wsse:PasswordText">password</wsse:password>
</wsse:usernametoken>
</wsse:security>
В Oracle Service Bus предусмотрен механизм для работы с Security Token. Для его использования нужно:
1. Создать policy. В нашем случае она выглядит как:
<wsp:policy wsu:id="WS-Policy-Siebel" xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wssp:identity xmlns:wssp="http://www.bea.com/wls90/security/policy">
<wssp:supportedtokens>
<wssp:securitytoken tokentype="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken">
<wssp:usepassword type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"></wssp:usepassword>
</wssp:securitytoken>
</wssp:supportedtokens>
</wssp:identity>
</wsp:policy>
2. Замапить её на вызываемый сервис на вкладке Policy конфигурации бизнес сервиса.
3. Создать Service Account с аутентификациооными данными и замапить его на появившейся вкладке Security BS.
Теперь при вызове сервиса в soap:head появляются необходимые аутентификационные данные:
<soapenv:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="unt_hzo9Xh2IiCqSYGaH">
<wsse:Username>USERNAME</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
Казалось бы все должно работать, однако, по факту, появляется ошибка, которая говорит о том, что что-то не так с атрибутом mustUnderstand. Пусть это не вводит в заблуждение - как выясняется, версия WS-Security Siebel и OSB не совпадает и поэтому Siebel не принимает аутентификационные данные.
<Body>
<Fault>
<faultcode>SOAP-ENV:MustUnderstand</faultcode>
<faultstring>Unable to process SOAP Header child element 'wsse:Security' with 'mustUnderstand="1"'((SBL-EAI-08000)</faultstring>
<detail>
<siebelf:siebdetail xmlns:siebelf="http://www.siebel.com/ws/fault">
<siebelf:logfilename>EAIObjMgr_nld_0014_14680077.log</siebelf:logfilename>
<siebelf:errorstack>
<siebelf:error>
<siebelf:errorcode>SBL-EAI-08000</siebelf:errorcode>
<siebelf:errorsymbol/>
<siebelf:errormsg>Unable to process SOAP Header child element 'wsse:Security' with 'mustUnderstand="1"'((SBL-EAI-08000)</siebelf:errormsg>
</siebelf:error>
</siebelf:errorstack>
</siebelf:siebdetail>
</detail>
</Fault>
</Body>
Выход из этой ситуации состоит в ручном заполнении soap header-а. Данные для заполнения можно взять из xquery функции fn-bea:lookupBasicCredentials, которая возвращает аутентификационную информацию.
Более подробную статью по аналогичной проблеме я обнаружил в процессе написания этой. Смотрите.
Комментариев нет:
Отправить комментарий