упреждающая аутентификация почему - PullRequest
4 голосов
/ 20 сентября 2011

Зачем нужна приоритетная аутентификация?

System.setProperty ("httpclient.authentication.preemptive", "true");

Я написал клиентскую программу доступа к веб-сервисам на Java. Где мы устанавливали имя пользователя и пароль в объекте вызова, и это работало отлично.

Недавно наш поставщик услуг внес некоторые изменения в свою сторону, и после этого они не получали имя пользователя и пароль при вызове веб-службы, а также потому, что они не получали имя пользователя и пароль, поэтому мы не смогли подключиться к их (поставщику) услуге. .

Тогда я занялся поиском и нашел информацию об упреждающей аутентификации. При вызове веб-сервисов мы устанавливаем «httpclient.authentication.preemptive» как «true» - System.setProperty («httpclient.authentication.preemptive», «true»); тогда мы сможем получить ответы от нашего поставщика услуг.

Когда мы удаляем System.setProperty («httpclient.authentication.preemptive», «true»); линия, то мы не можем подключиться к их услугам.

Ответы [ 2 ]

1 голос
/ 09 июля 2018

Вот как работает обычная аутентификация (она называется преимущественной аутентификацией - например, как это делает Curl):

  • Пользователь поручает клиенту сделать запрос на http://user:pass@example.com
  • Клиент делает запрос с заголовком вроде: Authorization: Basic dXNlcjpwYXNz
  • Сервер аутентифицирует пользователя и ответ с 200

Вот как работает не упреждающая аутентификация (например, как это делает HttpClient в Apache):

  • Пользователь поручает клиенту сделать запрос на http://user:pass@example.com
  • Клиент делает запрос без аутентификации
  • Сервер отвечает 401 и заголовком вроде: WWW-Authenticate: Basic realm="Default Realm"
  • Клиент делает второй запрос с заголовком вроде: Authorization: Basic dXNlcjpwYXNz
  • Сервер аутентифицирует пользователя и отвечает 200

Почему мы должны использовать второй метод? Это гарантирует, что только серверы, которым требуется аутентификация, получат ваш пароль. Но это означает, что сервер должен отвечать правильно (заголовок WWW-Authenticate). Возможно, это то, что сломало ваш случай и почему вам пришлось переопределить свой HTTP-клиент для принудительной аутентификации.

(Я предлагаю использовать Wireshark, если вы хотите получить лучшее представление о том, что на самом деле происходит между вашим клиентом и сервером. И вы можете прочитать документацию здесь для HTTP-клиента Apache по этой теме: http://hc.apache.org/httpclient-3.x/authentication.html)

1 голос
/ 27 февраля 2012

Когда мы изменили транспортную опору = " java: org.apache.axis.transport.http.HTTPSender " на транспортную опору = " java: org.apache. axis.transport.http.CommonsHTTPSender"в файле client-config.wsdd. Эта проблема была решена без установки System.setProperty ("httpclient.authentication.preemptive", "true"); .

client-config.wsdd -

<?xml version="1.0" encoding="UTF-8"?> 
<deployment 
    name="commonsHTTPConfig" 
    xmlns="http://xml.apache.org/axis/wsdd/" 
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">

  <!-- use CommonsHTTPSender instead of the default HTTPSender -->
  <transport name="http" pivot="java:org.apache.axis.transport.http.CommonsHTTPSender" />  

  <transport name="local" pivot = "java:org.apache.axis.transport.local.LocalSender" /> 
  <transport name="java" pivot="java:org.apache.axis.transport.java.JavaSender" /> 
</deployment>
...