Для моего проекта я хочу подключиться к предоставленному Shopware API Поскольку у меня нет опыта работы со службами REST, я клонировал существующий HTTPClient (с использованием компонентов Apache) из Github ,Я должен добавить, что Shopware предлагает DigestAuth в качестве метода аутентификации.
КОД:
public RestApiHttpClient(URL apiEndpoint, String username, String password) {
this.apiEndpoint = apiEndpoint;
BasicHttpContext context = new BasicHttpContext();
this.localContext = HttpClientContext.adapt(context);
HttpHost target = new HttpHost(this.apiEndpoint.getHost(), -1, this.apiEndpoint.getProtocol());
this.localContext.setTargetHost(target);
TargetAuthenticationStrategy authStrat = new TargetAuthenticationStrategy();
UsernamePasswordCredentials creds = new UsernamePasswordCredentials(username, password);
BasicCredentialsProvider credsProvider = new BasicCredentialsProvider();
AuthScope aScope = new AuthScope(target.getHostName(), target.getPort());
credsProvider.setCredentials(aScope, creds);
BasicAuthCache authCache = new BasicAuthCache();+
// Digest Authentication
DigestScheme digestAuth = new DigestScheme(Charset.forName("UTF-8"));
authCache.put(target, digestAuth);
this.localContext.setAuthCache(authCache);
this.localContext.setCredentialsProvider(credsProvider);
ArrayList<Header> defHeaders = new ArrayList<>();
defHeaders.add(new BasicHeader(HttpHeaders.ACCEPT, ContentType.APPLICATION_JSON.getMimeType()));
this.httpclient = HttpClients.custom()
.useSystemProperties()
.setTargetAuthenticationStrategy(authStrat)
.disableRedirectHandling()
.disableContentCompression()
.setDefaultHeaders(defHeaders)
.setDefaultCredentialsProvider(credsProvider)
.build();
}
Так что, если я тестирую этот скрипт, я получаю эту ошибку:
Dez 07, 2018 9:00:55 AM org.apache.http.impl.auth.HttpAuthenticator generateAuthResponse
SCHWERWIEGEND: DIGEST [complete=false, nonce=null, nc=0] authentication error: missing realm in challenge
{"success":false,"message":"Invalid or missing auth"}
Я попытался перезаписать параметры (сначала только область, затем область и одноразовый номер, чем каждый параметр), но безуспешно:
digestAuth.overrideParamter("realm", "Shopware REST-API");
digestAuth.overrideParamter("nonce", "somerandomnumber");
// or create random number;
digestAuth.overrideParamter("nonce", Long.toString(new Random().nextLong(), 36));
digestAuth.overrideParamter("qop", "auth");
digestAuth.overrideParamter("nc", "0");
digestAuth.overrideParamter("cnonce", DigestScheme.createCnonce());
Я предполагаю, что необходимость в DigestAuth - это значение nonce иливесь заголовок с сервера, но я не смог найти метод для хранения этих значений.Также попробовал этот один безуспешно.
Есть идеи?заранее спасибо!