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 请求。然后,我们使用 构建者设计模式 创建一个 HttpRequestGET 方法 设置请求的 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 上找到。


« 上一篇: Java Weekly, 第434期
» 下一篇: 检查MongoDB连接