抢占式身份验证为什么

San*_*osh 8 java authentication httprequest http-headers preemptive

为什么需要抢先认证?

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

我用java编写了Web服务访问客户端程序。我们在 call 对象中设置用户名和密码的地方,它工作得很好。

最近,我们的服务提供商在他们身边进行了一些更改,之后他们在网络服务调用中没有收到用户名和密码,并且由于他们没有收到用户名和密码,因此我们无法连接到他们的(提供商)服务。

然后我用谷歌搜索并发现了抢占式身份验证。在调用 Web 服务时,我们将 "httpclient.authentication.preemptive" 设置为 "true" - System.setProperty("httpclient.authentication.preemptive", "true"); ,然后我们就可以从我们的服务提供商那里收到回复。

当我们删除 System.setProperty("httpclient.authentication.preemptive", "true"); 线然后我们无法连接到他们的服务。

Cru*_*mmy 15

以下是常规身份验证的工作原理(又名先发制人身份验证 - 例如 Curl 是如何做到的):

  • 用户指示客户端向http://user:pass@example.com发出请求
  • 客户端使用如下标头发出请求: Authorization: Basic dXNlcjpwYXNz
  • 服务器使用 200 验证用户和响应

以下是非抢先式身份验证的工作原理(例如 Apache 的 HttpClient 是如何工作的):

  • 用户指示客户端向http://user:pass@example.com发出请求
  • 客户端在没有身份验证的情况下发出请求
  • 服务器响应 401 和一个标题,如: WWW-Authenticate: Basic realm="Default Realm"
  • 客户端使用如下标头发出第二个请求: Authorization: Basic dXNlcjpwYXNz
  • 服务器使用 200 验证用户和响应

为什么要使用第二种方法?它确保只有需要身份验证的服务器才能获取您的密码。但这确实意味着服务器必须以正确的方式响应(WWW-Authenticate标头)。也许这就是您遇到的问题,也是您必须覆盖 HTTP 客户端以强制抢先式身份验证的原因。

(如果您想更好地了解客户端和服务器之间实际发生的情况,我建议使用 Wireshark。您可以在此处阅读有关此主题的 Apache HTTP 客户端的文档:http : //hc.apache.org/ httpclient-3.x/authentication.html )


San*_*osh 1

当我们在 client-config.wsdd 文件中将Transport Pivot=" java:org.apache.axis.transport.http.HTTPSender "更改Transport Pivot=" java:org.apache.axis.transport.http.CommonsHTTPSender " 时。这个问题在没有设置 System.setProperty("httpclient.authentication.preemptive", "true"); 的情况下得到了解决 。

客户端配置.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>
Run Code Online (Sandbox Code Playgroud)