为什么要进行抢先身份验证?

问题描述 投票:0回答:2

为什么需要抢先验证?

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

我用java编写了访问客户端程序的Web服务。我们在调用对象中设置用户名和密码,效果非常好。

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

然后我进行了谷歌搜索并发现了抢占式身份验证。 在调用 Web 服务时,我们将

httpclient.authentication.preemptive
设置为
true
:

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

然后我们就可以收到服务提供商的回复。

当我们移除

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

那么我们就无法连接到他们的服务。

java authentication http-headers httprequest preemptive
2个回答
24
投票

以下是常规身份验证的工作原理(也称为抢先式身份验证 - 例如 Curl 的工作原理):

  • 用户指示客户端向 http://user:[email protected]
  • 发出请求
  • 客户端发出带有如下标头的请求:
    Authorization: Basic dXNlcjpwYXNz
  • 服务器验证用户身份并响应 200

以下是非抢占式身份验证的工作原理(例如 Apache 的 HttpClient 如何执行此操作):

  • 用户指示客户端向 http://user:[email protected]
  • 发出请求
  • 客户端未经身份验证发出请求
  • 服务器响应 401 和如下标头:
    WWW-Authenticate: Basic realm="Default Realm"
  • 客户端发出第二个请求,其标头如下:
    Authorization: Basic dXNlcjpwYXNz
  • 服务器验证用户身份并响应 200

为什么要使用第二种方法?它确保只有需要身份验证的服务器才能获取您的密码。但这确实意味着服务器必须以正确的方式响应(

WWW-Authenticate
标头)。也许这就是您遇到的问题,也是您必须覆盖 HTTP 客户端以强制进行抢先身份验证的原因。

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


1
投票

当我们在客户端中将传输枢轴 =“java:org.apache.axis.transport.http.HTTPSender更改为传输枢轴 =“java:org.apache.axis.transport.http.CommonsHTTPSender”时 - config.wsdd 文件。这个问题在没有设置 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>
© www.soinside.com 2019 - 2024. All rights reserved.