HTTP 身份验证 - Java 缺少通过 curl 存在的 Http 客户端 header
HTTP Authentication - Java Http Client is missing header that is present via curl
我正在尝试使用 java.net.http.HttpClient 将简单的 GET 发送到 HTTP 端点。端点需要基本身份验证。很简单,我正在做每个人都在做的事情:
HttpClient httpClient = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_1_1)
.authenticator(new Authenticator(){
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("guest","guest".toCharArray());
}
})
.build();
HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(URI.create("localhost:15672/api/overview")
.build();
HttpResponse<Void> httpResponse = httpClient.send(request, HttpResponse.BodyHandlers.discarding());
但是,这会引发 IOException“WWW-Authenticate header 响应代码 401 缺失”。服务器最初响应 401,然后客户端在 Authenticator 的帮助下 re-tries 请求,这对我来说并非完全不合理。 header 是强制性的,如果不存在,则需要例外。
到目前为止,还不错。但是,当我通过 curl 执行相同的请求时,header is present:
> curl -i http://localhost:15672/api/overview
HTTP/1.1 401 Unauthorized
content-length: 0
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
date: Thu, 08 Jul 2021 11:06:45 GMT
server: Cowboy
vary: origin
www-authenticate: Basic realm="RabbitMQ Management"
我做错了什么?
对于基本授权,你可以这样做
String plainCreds = "myuser:mypassword";
byte[] base64Bytes = Base64.encodeBase64(plainCreds.getBytes());
HttpRequest request = HttpRequest.newBuilder()
.get()
.uri(URI.create("localhost:15672/api/overview"))
.header("Authorization", "Basic " + new String(base64Bytes))
.build();
同时我发现了问题所在:我联系的服务器有问题。第一个 GET 返回的正是 curl 结果中显示的内容。 Java HttpClient 做出正确反应并发送了第二个带有凭据的 GET。凭据错误(出于测试目的)但响应不是人们预期的 403,而是另一个 401,而第二个 401 响应是缺少 header.
的响应
我正在尝试使用 java.net.http.HttpClient 将简单的 GET 发送到 HTTP 端点。端点需要基本身份验证。很简单,我正在做每个人都在做的事情:
HttpClient httpClient = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_1_1)
.authenticator(new Authenticator(){
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("guest","guest".toCharArray());
}
})
.build();
HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(URI.create("localhost:15672/api/overview")
.build();
HttpResponse<Void> httpResponse = httpClient.send(request, HttpResponse.BodyHandlers.discarding());
但是,这会引发 IOException“WWW-Authenticate header 响应代码 401 缺失”。服务器最初响应 401,然后客户端在 Authenticator 的帮助下 re-tries 请求,这对我来说并非完全不合理。 header 是强制性的,如果不存在,则需要例外。
到目前为止,还不错。但是,当我通过 curl 执行相同的请求时,header is present:
> curl -i http://localhost:15672/api/overview
HTTP/1.1 401 Unauthorized
content-length: 0
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
date: Thu, 08 Jul 2021 11:06:45 GMT
server: Cowboy
vary: origin
www-authenticate: Basic realm="RabbitMQ Management"
我做错了什么?
对于基本授权,你可以这样做
String plainCreds = "myuser:mypassword";
byte[] base64Bytes = Base64.encodeBase64(plainCreds.getBytes());
HttpRequest request = HttpRequest.newBuilder()
.get()
.uri(URI.create("localhost:15672/api/overview"))
.header("Authorization", "Basic " + new String(base64Bytes))
.build();
同时我发现了问题所在:我联系的服务器有问题。第一个 GET 返回的正是 curl 结果中显示的内容。 Java HttpClient 做出正确反应并发送了第二个带有凭据的 GET。凭据错误(出于测试目的)但响应不是人们预期的 403,而是另一个 401,而第二个 401 响应是缺少 header.
的响应