1.概述

本教程将演示如何在Apache HttpClient上配置基本身份验证4

如果你想更深入地研究并学习其他可以用HttpClient做的很酷的事情,请转到HttpClient的主要教程

进一步阅读:

HttpAsyncClient教程

HttpAsyncClient教程——发送一个基本的GET请求,使用多线程客户端,使用SSL和代理设置客户端,最后进行身份验证。

高级的HttpClient配置

高级用例的HttpClient配置。

2.使用API进行基本身份验证

让我们先从在HttpClient上配置基本身份验证的标准方法——通过aCredentialsProvider:

new BasicCredentialsProvider();UsernamePasswordCredentials = new UsernamePasswordCredentials("user1", "user1Pass");provider.setCredentials (AuthScope。任何凭证);HttpClient client = HttpClientBuilder.create() .setDefaultCredentialsProvider(provider) .build();HttpResponse response = client。执行(新HttpGet (URL_SECURED_BY_BASIC_AUTHENTICATION));int statusCode = response.getStatusLine() .getStatusCode();为了(statusCode等于(HttpStatus.SC_OK));

正如我们所看到的,创建带有凭据提供程序的客户机,并使用基本身份验证对其进行设置并不困难。

现在,要理解什么HttpClient将实际做的幕后,我们将需要查看日志:

#……request is sent with no credentials [main] DEBUG…- Authentication required [main] DEBUG…- localhost:8080 requested authentication [main] DEBUG…认证方案的优先顺序:[negotiate, Kerberos, NTLM, Digest, Basic] [main] DEBUG…- Challenge for negotiate authentication scheme not available [main] DEBUG…- Challenge for Kerberos authentication scheme not available [main] DEBUG…NTLM认证方案的挑战不可用[main] DEBUG…- Challenge for Digest authentication scheme not available [main] DEBUG…-选择的认证选项:[基本]#… the request is sent again - with credentials

整个客户机-服务器通信现在是清晰的:

  • 客户端发送没有凭据的HTTP请求
  • 服务器发回一个挑战
  • 客户端协商并确定正确的认证方案
  • 客户端发送第二个请求这一次,他需要凭据

3.先发制人的基本身份验证

打开盒子HttpClient不做先发制人的身份验证。相反,这必须是由客户端做出的明确决定。

首先,我们需要创建HttpContext—预填充认证缓存预先选择正确的认证方案类型。这将意味着前面例子中的协商不再是必要的已经选择了基本身份验证:

HttpHost targetHost = new HttpHost("localhost", 8082, "http");CredentialsProvider = new BasicCredentialsProvider();credsProvider.setCredentials (AuthScope。ANY, new UsernamePasswordCredentials(DEFAULT_USER, DEFAULT_PASS));AuthCache AuthCache = new BasicAuthCache();authCache。把(新BasicScheme targetHost ());//将AuthCache添加到执行上下文中context.setCredentialsProvider (credsProvider);context.setAuthCache (authCache);

现在我们可以使用带有新上下文和的客户机发送认证前请求:

HttpClient client = HttpClientBuilder.create().build();响应=客户机。execute(new HttpGet(URL_SECURED_BY_BASIC_AUTHENTICATION), context);int statusCode = response.getStatusLine().getStatusCode();为了(statusCode等于(HttpStatus.SC_OK));

让我们看看日志:

[主要]调试……-重用缓存的‘basic’认证方案http://localhost:8082 [main] DEBUG…-执行请求GET /spring-security-rest-basic-auth/api/foo /1 HTTP/1.1 [main] DEBUG…/ /spring-security-rest-basic-auth/api/foo /1 HTTP/1.1 [main] DEBUG…[main] DEBUG…dXNlcjE6dXNlcjFQYXNz [main] DEBUG…<< HTTP/1.1 200 OK [main] DEBUG…——身份验证成功

一切都看起来好:

  • “基本认证”方案是预先选定的
  • 属性发送请求授权
  • 服务器用一个200好了
  • 身份验证成功

4.带有原始HTTP头的基本认证

抢占式基本身份验证基本上意味着预先发送授权头。

所以,我没有通过前面那个相当复杂的例子来建立它,我们可以控制这个标题并手工构造它:

request = new HttpGet(URL_SECURED_BY_BASIC_AUTHENTICATION);String auth = DEFAULT_USER + ":" + DEFAULT_PASS;byte[] encodedAuth = Base64。encodeBase64 (auth.getBytes (StandardCharsets.ISO_8859_1));String authHeader = "Basic " + new String(encodedAuth);request.setHeader (HttpHeaders。授权,authHeader);HttpClient client = HttpClientBuilder.create().build();HttpResponse response = client.execute(request);int statusCode = response.getStatusLine().getStatusCode();为了(statusCode等于(HttpStatus.SC_OK));

让我们确保这是正确的工作:

[主要]调试……- Auth缓存没有设置在上下文[main] DEBUG…-打开连接{}->http://localhost:8080 [main] DEBUG…- connect to localhost/127.0.0.1:8080 [main] DEBUG…-执行请求GET /spring-security-rest-basic-auth/api/foo /1 HTTP/1.1 [main] DEBUG…-代理认证状态:unchallenge [main] DEBUG…spring-security-rest-basic-auth/api/foo /1 HTTP/1.1 [main] DEBUG…- http-outgoing-0 >>授权:Basic dXNlcjE6dXNlcjFQYXNz [main] DEBUG…- HTTP -outgoing-0 << HTTP/1.1 200 OK

所以,即使没有认证缓存,基本身份验证仍然正常工作,我们接收200好了。

5.结论

本文演示了使用Apache HttpClient 4设置和使用基本身份验证的各种方法。

与往常一样,本文提供的代码是可用的在Github。这是一个基于Maven的项目,因此它应该很容易导入和运行。

通用的底部

通过。开始使用Spring 5和Spring Boot 2学习的春天课程:

>>查看课程
7评论
最古老的
最新的
内联反馈
查看所有评论
本文评论关闭!