Java 中的 Http 客户端 API:身份验证

举报
千锋教育 发表于 2023/07/24 13:19:11 2023/07/24
【摘要】 介绍在本系列的第一部分(链接此处)中,介绍了 java http 客户端 API 的基本功能。现在我们将探讨当今应用程序中广泛使用的一些更常见的用例。我们将学习如何通过提供凭据来访问安全端点。基本认证基本身份验证是保护 Internet 上的 Web 资源的一种简单方法。其工作原理如下:客户端想要通过 HTTP 访问受保护的资源并提供用户名/密码。凭证在授权 HTTP 标头中发送。格式很重要...

企业微信截图_20230724131720.jpg

介绍

在本系列的第一部分(链接此处)中,介绍了 java http 客户端 API 的基本功能。现在我们将探讨当今应用程序中广泛使用的一些更常见的用例。
我们将学习如何通过提供凭据来访问安全端点。

基本认证

基本身份验证是保护 Internet 上的 Web 资源的一种简单方法。其工作原理如下:

  • 客户端想要通过 HTTP 访问受保护的资源并提供用户名/密码。凭证在授权 HTTP 标头中发送。格式很重要,必须完全如下所示:基本凭据,其中凭据是用户名:密码的 Base64 编码。请注意用户名和密码之间的单个冒号。
  • Web 服务器接收 HTTP 请求,从标头中提取编码的凭据并进行验证。如果不匹配,通常会返回401状态码(未经授权的错误)。如果匹配,将允许访问。

现在我们知道了理论,让我们将其付诸实践。由于 Spring Security 模块,我们在前面的文章中使用的端点现在得到了保护(这将是以后的文章,敬请关注!)。当尝试通过执行以下代码获取客户列表时

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("http://localhost:8080/api/v1/customers"))
    .GET()
    .build();

HttpResponse<String> response = client
    .send(request, HttpResponse.BodyHandlers.ofString());
System.out.printf("Status %s \n", response.statusCode());

响应返回 401 代码。因此,必须发送凭据

Status 401

使用 HTTP 标头进行身份验证

将凭据传递到端点的第一种方法是在 http 请求对象中设置标头。HttpRequest 类包含两种不同的方法来添加/设置标头:

  • setHeader 方法将给定的名称/值对设置为此请求的标头集。这将覆盖任何先前设置的名称值。

  • 另一方面,标头方法将给定的名称/值对添加到该请求的标头集中。给定值将添加到该名称的值列表中。

还有第三个选项可以添加多个标头。这里我们只调用 header 方法。代码如下所示

String credentials = "user1234:password5678";
String headerValue = "Basic " + Base64.getEncoder()
    .encodeToString(credentials.getBytes());

var request = HttpRequest.newBuilder()
    .uri(URI.create("http://localhost:8080/api/v1/customers"))
    .header("Authorization", headerValue)
    .GET()
    .build();

借助 java.util 包中的 Base64 类可以轻松完成编码。并且授予对资源的访问权限。控制台输出

Status 200 
Body [{"id":1,"name":"Joe Smith","email":"joe.smith@gmail.com",...

使用 Authenticator 类进行身份验证

提供凭据的第二种方法是在 HttpCLient 对象中配置身份验证器。Authenticator 是一个抽象类,它知道如何获取网络连接的身份验证。身份验证器类通过提示用户输入用户名和密码等凭据信息来执行身份验证。应用程序将实现一个具体的子类并覆盖 getPasswordAuthentication。该函数仅返回数据持有者类PasswordAuthentication以及用户名和密码。

代码如下

var client = HttpClient.newBuilder()
    .connectTimeout(Duration.ofMillis(500))
    .authenticator(new Authenticator() {
        @Override
       protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(
            "user1234", "password5678".toCharArray());
        }
    })
    .build();

控制台显示调用端点成功

Status 200 
Body [{"id":1,"name":"Joe Smith","email":"joe.smith@gmail.com",...

概括

在这篇短文中,我们了解了如何使用 Java Http Client API 访问受保护的资源。只需几行代码即可轻松设置。这是通过将 Authorization 标头添加到 HttpRequest 对象或在 HttpClient 对象中配置 Authenticator 类来实现的。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。