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, которая возвращает аутентификационную информацию.
Более подробную статью по аналогичной проблеме я обнаружил в процессе написания этой. Смотрите.
Комментариев нет:
Отправить комментарий