Spring CXF Soap Client Учетные данные клиента OAuth2 - PullRequest
0 голосов
/ 16 октября 2019

Я хочу использовать веб-службу SOAP, для которой требуется аутентификация OAuth2 с типом гранта client_credentials.

Из документации (http://cxf.apache.org/docs/jax-rs-oauth2.html#JAX-RSOAuth2-AdvancedOAuth2clientapplications) я нашел BearerAuthSupplier, который может быть полезен. Поэтому я попытался

    @Bean
    public CustomName customName()
    {

        final JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
        factoryBean.setServiceClass(CustomName.class);
        factoryBean.setAddress("");
        final CustomName serviceClient = (CustomName ) factoryBean.create();

        // Get the underlying Client object from the proxy object of service interface
        final org.apache.cxf.endpoint.Client proxy = ClientProxy.getClient(serviceClient);

        final HTTPConduit conduit = (HTTPConduit) proxy.getConduit();

        final BearerAuthSupplier supplier = new BearerAuthSupplier();
        supplier.setAccessTokenServiceUri("");
        supplier.setConsumer(new Consumer("client-id", "client-secret"));
        supplier.setRefreshEarly(true);
        conduit.setAuthSupplier(supplier);

        return serviceClient;


    }


В заголовке авторизации у меня было утверждение Basic (я хотел Bearer). Плюс, у меня не было возможности установить область действия токена. Я думаю, что естьчто-то, что я пропустил ...

Чтобы это заработало, мне пришлось расширить BearerAuthSupplier до такого типа

public class CustomAuthSupplier extends BearerAuthSupplier {

    private String accessTokenServiceUri;

    public String getAuthorization(AuthorizationPolicy authPolicy,
                                   URI currentURI,
                                   Message message,
                                   String fullHeader) {

        ClientCredentialsGrant clientCredentialsGrant = new ClientCredentialsGrant("scope_needed");
        clientCredentialsGrant.setClientId(this.getConsumer().getClientId());
        clientCredentialsGrant.setClientSecret(this.getConsumer().getClientSecret());

        WebClient wc = WebClient.create(this.accessTokenServiceUri, Collections.singletonList(new OAuthJSONProvider()));
        ClientAccessToken at = OAuthClientUtils.getAccessToken(wc,clientCredentialsGrant);
        this.setClientAccessToken(at);

        return super.getAuthorization(authPolicy, currentURI, message, fullHeader);
    }

    public void setAccessTokenServiceUri(String uri) {
        this.accessTokenServiceUri = uri;
        super.setAccessTokenServiceUri(uri);
    }

Пока все работает хорошо, но я нахожу это немного сложным(и я не совсем уверен в том, что я делаю.) Мой вопрос: как выполнить предоставление учетных данных клиента с помощью CXF при вызове Soap WS?

...