Передача учетных данных при вызове API в Scala

#java #scala #rest

#java #scala #rest

Вопрос:

Я пытаюсь вызвать конечную точку REST, используя HttpGet, и передать учетные данные пользователя.

 var content = ""
val httpClient : CloseableHttpClient = HttpClients.createDefault();
val httpResponse = new HttpGet(url)
httpResponse.addHeader(BasicScheme.authenticate(new UsernamePasswordCredentials(“uname”,”pwd”),”UTF-8", false))
val response = httpClient.execute(httpResponse)
val entity = httpResponse.getEntity()
val inputStream = entity.getContent()
content = fromInputStream(inputStream).getLines.mkString
inputStream.close
httpClient.getConnectionManager().shutdown()
return content
  

Похоже, что BasicScheme устарела в «org.apache.http.impl.auth». Любые указания о том, как двигаться дальше…
Заранее спасибо.

Ответ №1:

Учитывая, что вы пытаетесь использовать базовую аутентификацию, этого должно быть достаточно

 val credentialsProvider = new BasicCredentialsProvider()
credentialsProvider.setCredentials(
    AuthScope.ANY, 
    new UsernamePasswordCredentials("username", "password")
)

val httpClient = 
    HttpClientBuilder.create()     
                     .setDefaultCredentialsProvider(credentialsProvider)
                     .build()

val httpResponse = new HttpGet(url)
httpClient.execute(httpResponse)
  

Если вместо этого вы предпочитаете использовать простой заголовок HTTP, вы можете использовать

 def buildEncodedCredentials(): String = {
    val credentialsString = username   ":"   password
    val charset = StandardCharsets.ISO_8859_1
    val encodedBytes = Base64.getEncoder().encode(credentialsString.getBytes(charset))
    return new String(encodedBytes, charset)
}
  

  httpResponse.addHeader(HttpHeaders.AUTHORIZATION, "Basic "   buildEncodedCredentials())
  

Комментарии:

1. Спасибо @LppEdd — Я пытался использовать CredentialsProvider ранее, но я получаю ошибку 401 — error =»неавторизованный», error_description = «Для доступа к этому ресурсу требуется полная аутентификация» По какой-то причине вышеупомянутое решение не работает в моем случае…

2. @Anil попробуйте использовать простой способ заголовка и дайте мне знать. Мы можем начать чат, чтобы избежать рассылки спама в комментариях.

3. @Anil кстати, ты уверен, что это базовая аутентификация, которая тебе нужна?

4. По-прежнему 401 без описания ошибки org.apache.http.client.methods. CloseableHttpResponse = HttpResponseProxy{HTTP/1.1 401 [Параметры X-Content-Type: nosniff, X-XSS-Защита: 1; режим = блок, управление кэшем: без кэша, без хранилища, максимальный возраст= 0, обязательная проверка, Pragma: без кэша, срок действия: 0, параметры X-Frame: ЗАПРЕТИТЬ, WWW-Аутентификация: Базовая область = «Realm», тип содержимого: приложение / json; кодировка=UTF-8, Кодировка передачи: фрагментированная, Дата: Ср, 27 марта 2019 19:42:57 GMT, Соединение: закрыто] ResponseEntityProxy{[Тип содержимого: application/json; кодировка=UTF-8, Фрагментированный: true]}}

5. @Anil не могли бы вы опубликовать код Spark, который вы использовали для отправки запроса?