1. 概述
在这个简短的教程中,我们将探讨基本身份验证。我们将了解其工作原理,并配置 Java HttpClient 来使用这种身份验证方法。
2. 基本身份验证
基本身份验证是一种简单的身份验证方式。客户端可以通过用户名和密码进行身份验证。 这些凭据以特定格式发送到 HTTP 头部的 Authorization 字段。它以 Basic 关键字开始,后面跟着经过 base64 编码的 username:password 值。这里的冒号符号非常重要。头字段必须严格遵循此格式。
例如,使用 baeldung 用户名和 HttpClient 密码进行身份验证时,我们需要发送这样的头字段:
Basic YmFlbGR1bmc6SHR0cENsaWVudA==
我们可以使用 base64 解码器来验证它并检查解码结果。
3. Java HttpClient
*Java 9 引入了一个新的 HttpClient,作为孵化模块在 Java 11 中标准化。* 我们将使用 Java 11,因此我们可以直接从 java.net.http 包导入,无需额外配置或依赖。
首先,让我们执行一个不进行任何身份验证的简单 GET 请求:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(new URI("https://postman-echo.com/get"))
.build();
HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
logger.info("Status {}", response.statusCode());
首先,我们创建一个 HttpClient,用于执行 HTTP 请求。然后,我们使用 构建者设计模式 创建一个 HttpRequest。GET 方法 设置请求的 HTTP 方法。uri 方法 设置我们希望发送请求的 URL。
之后,我们使用客户端发送请求。send 方法的第二个参数是一个 响应体处理器。这告诉客户端我们希望将响应体视为字符串。
运行我们的应用程序并查看日志。输出应该如下所示:
INFO com.baeldung.httpclient.basicauthentication.HttpClientBasicAuthentication - Status 200
我们看到 HTTP 状态码为 200,意味着我们的请求成功。 接下来,我们将看看如何处理身份验证。
4. 使用 HttpClient Authenticator
在配置身份验证之前,我们需要一个需要身份验证的测试 URL。让我们使用一个 Postman Echo 终点。首先,将之前的 URL 更改为这个,并再次运行应用程序:
HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(new URI("https://postman-echo.com/basic-auth"))
.build();
检查日志,查找状态代码。这次我们收到了 HTTP 状态码 401 "未经授权"。这个响应代码表示端点要求身份验证,但客户端没有发送任何凭据。
现在,让我们更改客户端,使其发送所需的认证数据。我们可以通过配置 HttpClient Builder 来实现这一点,这样客户端就会使用我们设置的凭据。 该端点接受用户名 “postman” 和密码 “password”。让我们为客户端添加一个 authenticator:
HttpClient client = HttpClient.newBuilder()
.authenticator(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("postman", "password".toCharArray());
}
})
.build();
再次运行应用程序。现在请求成功,我们收到 HTTP 状态码 200。
5. 使用 HTTP 头部进行身份验证
我们可以使用另一种方法访问需要身份验证的端点。我们已经在前面的章节中学到了如何构造 Authorization 头部,所以我们可以手动设置其值。 尽管这需要为每个请求单独设置,而不是通过 authenticator 设置一次。
让我们移除 authenticator,看看如何设置请求头。我们需要使用 Base64 编码 构造头部值:
private static final String getBasicAuthenticationHeader(String username, String password) {
String valueToEncode = username + ":" + password;
return "Basic " + Base64.getEncoder().encodeToString(valueToEncode.getBytes());
}
让我们为 Authorization 头部设置这个值并运行应用程序:
HttpRequest request = HttpRequest.newBuilder()
.GET()
.uri(new URI("https://postman-echo.com/basic-auth"))
.header("Authorization", getBasicAuthenticationHeader("postman", "password"))
.build();
我们的请求成功,这意味着我们正确地构造并设置了头部值。
6. 总结
在这篇简短的教程中,我们了解了什么是基本身份验证以及它是如何工作的。我们使用 Java HttpClient 与基本身份验证配合,通过为它设置一个 authenticator。我们还通过手动设置 HTTP 头部采用了一种不同的身份验证方法。
如往常一样,这些示例的源代码可在 GitHub 上找到。