Запрос JAX-WS с базовой аутентификацией - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь вызвать веб-сервис SOAP, используя обработчики с базовой авторизацией, но каким-то образом API отвечает несанкционированным 401.

@Override
public boolean handleMessage(SOAPMessageContext context) {
    Boolean outboundProperty = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
    if (outboundProperty.booleanValue()) {
        String authString = parameter.getUser() + ":" + parameter.getPassword();
        try {
             Map<String, List<String>> headers = (Map<String, List<String>>)
                     context.get(MessageContext.HTTP_REQUEST_HEADERS);

             if (null == headers) {
                 headers = new HashMap<String, List<String>>();
             }

             headers.put("Authorization", Collections.singletonList(
                 "Basic " + new String(Base64.encode(authString.getBytes()))));
        } catch(Exception e) {
            log4j.error(e.getMessage(), e);
        }
    }
    return outboundProperty;
}

Когда я использую интерфейс SOAP и вручную добавляю заголовок авторизации (значение из кода во времяотладка) затем я получаю ответ от конечной точки, но с помощью кода это не удается на данный момент.

Любые указатели были бы действительно полезны.Спасибо

1 Ответ

0 голосов
/ 07 декабря 2018

Вам нужно изменить свой код следующим образом:

@Override
public boolean handleMessage(SOAPMessageContext context) {
    Boolean outboundProperty = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
    if(outboundProperty.booleanValue()){
        try{
            String authString = parameter.getUser() + ":" + parameter.getPassword();
            SOAPMessage soapMessage =context.getMessage();
            String authorization = new sun.misc.BASE64Encoder().encode(authString.getBytes());
            soapMessage.getMimeHeaders().addHeader("Authorization","Basic " + authorization);   
            soapMessage.saveChanges(); 
        }catch(Exception e){
            log4j.error(e.getMessage(), e);
        }
    }
    return true;
}

Обновлено:

Как объяснено здесь Вы должны использовать Base64Coder с sun.misc.BASE64Encoder()для кодирования authString

Также вы должны всегда возвращать true из этого метода, в противном случае вы заблокируете обработку цепочки запросов обработчика, возвращая false.

...