У меня есть требование для вызова веб-службы SOAP 4.0 (на основе руководства по веб-службам https://kupdf.net/download/soap-4-0-amadeus-wbs-implementation-guide_58c657a8dc0d605613339031_pdf), которая требует аутентификации заголовка безопасности.К сожалению, в моем коде JAVA я в настоящее время застрял в шаге параметра пароля - что дает мне исключение под названием
2019-02-25 19:06:36 ОШИБКА ExceptionHandler: 36 - Отладка клиента: 11 |сессия |org.apache.cxf.binding.soap.SoapFault: 11 | Session |в org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.unmarshalFault (Soap11FaultInInterceptor.java:86) в org.apache.cxf.binding.soap.interceptor.Soap11FaultInInterceptor.handleMessorj_setap.cxf.binding.(AbstractFaultChainInitiatorObserver.java:112) в org.apache.cxf.binding.soap.interceptor.CheckFaultInterceptor.handleMessage (CheckFaultInterceptor.java:69) в org.apache.cxf.binding.soap.interceptor.Inage.jor: 34) в org.apache.cxf.phase.PhaseInterceptorChain.doIntercept (PhaseInterceptorChain.java:308) в org.apache.cxf.endpoint.ClientImpl.onMessage (ClientImpl.java:798) в org.apache.cf.http.HTTPConduit $ WrappedOutputStream.HTTPConduit.java:1330) в java.util.zip.DeflaterOutputStream.close (DeflaterOutputStream.java:241) в org.apache.cxf.io.AbstractWrappedOutputStream.close (AbstractWrappedOutputStream.java:77) в org.ap,org.apache.cxf.transport.AbstractConduit.close (AbstractConduit.java:56) в org.apache.cxf.transport.http.HTTPConduit.close (HTTPConduit.java:652) в org.apache.cxf.interceptor.MessageSenderInceptMessageSenderEndingInterceptor.handleMessage (MessageSenderInterceptor.java:62) в org.apache.cxf.phase.PhaseInterceptorChain.doIntercept (PhaseInterceptorChain.java:308) по адресу org.apache.cxf.endpoint.ClientImpl.doInvoke (ClientImpl.java:514) по адресу org.apache.cxf.endpoint.ClientImpl.invoke (ClientImp23lg) или.apache.cxf.endpoint.ClientImpl.invoke (ClientImpl.java:324) в org.apache.cxf.endpoint.ClientImpl.invoke (ClientImpl.java:277) в org.apache.cxf.endpoint.ClientImpl.lv (:на119) на com.sun.proxy. $ Proxy48.invoke (неизвестный источник) на com.dlh.zambas.mw.client.ServiceProxy.callService (ServiceProxy.java:230) на com.dlh.zambas.mw.client.ServiceProxy.invoke (ServiceProxy.java:114)
ОШИБКА ExceptionHandler: 39 - Отладка клиента: null
Для параметра пароля требуется алгоритм генерации дайджеста пароля в формате:
Base64(SHA1($NONCE + $TIMESTAMP + SHA1($CLEARPASSWORD)))
Где: Base64
- схема кодирования двоичного текста;SHA1
- криптографическая хеш-функция;+
- функция конкатенации;$NONCE
- входной параметр, сгенерированный клиентским приложением;$TIMESTAMP
- входной параметр, который представляет текущую временную метку;$CLEARPASSWORD
является параметром ввода - необработанный пароль.
Ниже приведен фрагмент кода, который я пытаюсь:
private String buildPasswordDigest(String nonce, String timestamp, String pass) {
nonce=generateNonce();
timestamp=generateTimestamp();
pass="Test"
try
{
MessageDigest msdDigest = MessageDigest.getInstance("SHA-1");
msdDigest.update(pass.getBytes("UTF-8"), 0, pass.length());
sha1_pass = byteToHex(msdDigest.digest());
msdDigest.reset();
String input_sha1= nonce+timestamp+sha1_pass;
msdDigest.update(input_sha1.getBytes("UTF-8"), 0, input_sha1.length());
return Base64.encodeBase64String(msdDigest.digest());
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return passwordDigest;
}
private static String byteToHex(final byte[] hash){
Formatter formatter = new Formatter();
for (byte b : hash)
{
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
private String generateNonce() {
String dateTimeString = Long.toString(new Date().getTime());
byte[] nonceByte = dateTimeString.getBytes();
return Base64.encodeBase64String(nonceByte);
}
private String generateTimestamp() {
DateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
Date today = Calendar.getInstance().getTime();
return dateFormatter.format(today);
}
Не соответствует ли он какому-либо формату?