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

createh52个月前 (02-01)技术教程12

.

介绍

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

基本认证

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

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

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

Bash
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 代码。因此,必须发送凭据

Bash
Status 401

使用 HTTP 标头进行身份验证

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

  • setHeader 方法将给定的名称/值对设置为此请求的标头集。这将覆盖任何先前设置的名称值。
  • 另一方面,标头方法将给定的名称/值对添加到该请求的标头集中。给定值将添加到该名称的值列表中。

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

Bash
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 类可以轻松完成编码。并且授予对资源的访问权限。控制台输出

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

使用 Authenticator 类进行身份验证

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

代码如下

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

控制台显示调用端点成功

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

概括

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

关注并回复1即可领取【Java学习资料大礼包】

相关文章

JavaWEB前端向服务器端发送对象(java向服务器发送数据)

最近项目中需要做一个关于批量删除的功能,删除条件有多个,需要从页面全部传给后台服务器程序,单个的删除,可以拼接参数给url,服务器端获取参数后执行删除操作即可。但是批量删除多个,参数会很多,传递就有些...

用了这么久,token和session的区别,你真的清楚了吗?

session和token都是用来保持会话,功能相同一、session机制,原理session是服务端存储的一个对象,主要用来存储所有访问过该服务端的客户端的用户信息(也可以存储其他信息),从而实现保...

学习必备|分布式即时通讯服务端java版附源码

今日推荐:分布式即时通讯服务端推荐一款基于java开发的分布式即时通讯服务端,网络基于netty,akka实现实时信息,提供简单的API服务 ,方便二次开发。特点:1、支持单击部署,也支持集群部署2、...

JVM学习笔记之Client Server端的区别

java -version 命令大家都用过,大部分就是看下jdk版本或检查下环境变量的设置,但最后一行的信息也挺重要,如下图所示:Server VM表示我们的虚拟机类型,mixed mode表示虚拟机...

拒绝接口裸奔!开放API接口签名验证

接口安全问题请求身份是否合法?请求参数是否被篡改?请求是否唯一?AccessKey&SecretKey (开放平台)请求身份为开发者分配AccessKey(开发者标识,确保唯一)和SecretKey(...

图文并茂,带你梳理一下 OAuth2.0 概念和授权流程

阅读目录OAuth2 的概念OAuth2授权模式授权码模式(Authorization Code Grant)隐式授权模式(Implicit Grant)密码模式(Resource Owner Pas...