Почему безопасная интеграция SOAP возвращает несанкционированный [401] с использованием Spring WS? - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь использовать защищенный сторонний веб-сервис SOAP и следую за Spring WS spring-ws-core плюс сетевой ресурс, описывающий безопасную интеграцию Spring WS - HTTPS Пример клиент-сервер . После нахождения файлов сертификата .cer и .jks в ресурсе я использовал этот код для переноса своей конфигурации:

@Configuration
public class WSGeneralConfig {

    @Autowired
    @Qualifier("WifiTouristConfig")
    CredentailsConfig wifiTouristConfig;

    @Autowired
    @Qualifier("TradeinWSConfig")
    CredentailsConfig tradeinWSConfig;

    @Autowired
    ClientInterceptor[] interceptors;

    @Bean
    public WifiToursitWrapper wifiToursitWrapper(@Value("${tibco.wifi.tourist.url}") String uri) throws Exception {
        WifiToursitWrapper wifiToursitWrapper = new WifiToursitWrapper();
        Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
        marshaller.setContextPath("com.usp.tibco.wifi");
        wifiToursitWrapper.setMarshaller(marshaller);
        wifiToursitWrapper.setUnmarshaller(marshaller);
        wifiToursitWrapper.setDefaultUri(uri);
        wifiToursitWrapper.setInterceptors(interceptors);
        wifiToursitWrapper.setMessageSender(
                httpComponentsMessageSender(wifiTouristConfig.getUsername(), wifiTouristConfig.getPassword()));
        return wifiToursitWrapper;
    }

    public HttpComponentsMessageSender httpComponentsMessageSender(String userName, String password) throws Exception {
        HttpComponentsMessageSender httpComponentsMessageSender = new HttpComponentsMessageSender();
        httpComponentsMessageSender.setCredentials(new UsernamePasswordCredentials(userName, password));
        httpComponentsMessageSender.setHttpClient(httpClient());
        httpComponentsMessageSender.setAuthScope(AuthScope.ANY);
        httpComponentsMessageSender.afterPropertiesSet();
        return httpComponentsMessageSender;
    }

    public HttpClient httpClient() throws Exception {
        return HttpClientBuilder
                .create()
                .setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext(), NoopHostnameVerifier.INSTANCE))
                .addInterceptorFirst(new RemoveSoapHeadersInterceptor()).build();
    }


    public SSLContext sslContext() throws Exception {
        File file = new ClassPathResource("cert/cacerts.jks").getFile();
        return SSLContextBuilder.create().loadTrustMaterial(file, "jksPassword".toCharArray()).build();
    }
}

Класс клиента также нравится

public class WifiToursitWrapper extends WebServiceGatewaySupport {

    @SoapOperationName(systemName = SystemName.TIBCO, operationName = "RegisterByIntlNo")
    public RegisterByIntlNoResponse registerByIntlNo(RegisterByIntlNoRequest request) {
        return (RegisterByIntlNoResponse) getWebServiceTemplate().marshalSendAndReceive(request,
                message -> ((SoapMessage) message)
                        .setSoapAction("/RegisterByIntlNo"));
    }
}

К сожалению, я получил несанкционированное исключение, и я не знаю, что является основной причиной этого? вот снимок из трассировки стека исключений

org.springframework.ws.client.WebServiceTransportException: Unauthorized [401]
    at org.springframework.ws.client.core.WebServiceTemplate.handleError(WebServiceTemplate.java:699)
    at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:609)
    at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:555)
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:390)
    at org.springframework.ws.client.core.WebServiceTemplate.marshalSendAndReceive(WebServiceTemplate.java:383)
    at com.etisalat.account.wrapper.WifiToursitWrapper.registerByIntlNo(WifiToursitWrapper.java:25)

Благодарим вас за поддержку и заранее благодарим.

1 Ответ

1 голос
/ 16 июня 2019

Я решил проблему, добавив Базовую аутентификацию к моему запросу, с хорошей помощью из ответа на этот вопрос Использование SOAP WS возвращает ошибку 401 неавторизованным , я изменил небольшой код для своего случай.

private HttpComponentsMessageSender httpComponentsMessageSender(String userName, String password) throws Exception {
        HttpComponentsMessageSender httpComponentsMessageSender = new HttpComponentsMessageSender();
        httpComponentsMessageSender.setHttpClient(httpClient(userName, password));
        return httpComponentsMessageSender;
    }

    private HttpClient httpClient(String username, String password) throws Exception {
        List<Header> headers = new ArrayList<>();
        BasicHeader authHeader = new BasicHeader("Authorization", "Basic " + base64authUserPassword(username, password));
        headers.add(authHeader);
        RequestDefaultHeaders reqHeader = new RequestDefaultHeaders(headers);
        return HttpClientBuilder.create()
                .setSSLSocketFactory(new SSLConnectionSocketFactory(sslContext(), NoopHostnameVerifier.INSTANCE))
                .addInterceptorFirst(new RemoveSoapHeadersInterceptor()).addInterceptorLast(reqHeader).build();
    }

    private String base64authUserPassword(String username, String password) {
        String userpassword = username + ":" + password;
        String encodedAuthorization = new String(Base64.getEncoder().encode(userpassword.getBytes()));
        return encodedAuthorization;
    }
...