1. 概述
在这个简短的教程中,我们将了解基本身份验证。我们将了解它是如何工作的,并配置Java HttpClient以使用这种身份验证。
2. 基本认证
基本身份验证是一种简单的身份验证方法。客户端可以通过用户名和密码进行身份验证。这些凭据以特定格式在Authorization HTTP标头中发送。它以Basic关键字开头,后跟一个base64编码的username:password值。冒号字符在这里很重要。标头应严格遵循此格式。
例如,要使用tuyucheng用户名和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方法的第二个参数是响应体处理程序。这告诉客户端我们希望将响应正文视为String。
让我们运行我们的应用程序并检查日志。输出应如下所示:
INFO cn.tuyucheng.taketoday.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”。让我们为我们的客户端添加一个身份验证器:
HttpClient client = HttpClient.newBuilder()
.authenticator(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("postman", "password".toCharArray());
}
})
.build();
让我们再次运行应用程序。现在请求成功,我们收到HTTP状态200。
5. 使用HTTP标头进行身份验证
我们可以使用另一种方法来访问需要身份验证的端点。我们从前面的章节中了解了Authorization标头是如何构造的,因此我们可以手动设置它的值。尽管这必须根据请求完成,而不是通过身份验证器设置一次。
让我们删除身份验证器,看看我们如何设置请求标头。我们需要使用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设置身份验证器来使用具有基本身份验证的Java HttpClient。我们通过手动设置HTTP标头来使用不同的方法进行身份验证。
与往常一样,本教程的完整源代码可在GitHub上获得。