代理登录属于传输层的凭据提供器。对于 Spring 6 搭配 Apache HttpClient 5 的情况,请把该账户限定在中介上:

var proxy = new org.apache.hc.core5.http.HttpHost(
    "http", "proxy.example", 8080);
var credentials = new org.apache.hc.client5.http.impl.auth
    .BasicCredentialsProvider();
credentials.setCredentials(
    new org.apache.hc.client5.http.auth.AuthScope(proxy),
    new org.apache.hc.client5.http.auth.UsernamePasswordCredentials(
        proxyUser, proxyPassword.toCharArray()));

var http = org.apache.hc.client5.http.impl.classic.HttpClients.custom()
    .setProxy(proxy)
    .setDefaultCredentialsProvider(credentials)
    .build();
var factory = new org.springframework.http.client
    .HttpComponentsClientHttpRequestFactory(http);
var rest = new org.springframework.web.client.RestTemplate(factory);

应用提供 proxyUser 和 proxyPassword 值,并掌管 HTTP 客户端的生命周期。请为工作负载复用 rest,而不要在调用点再构建一个默认模板。

AuthScope 限定了该凭据的适用范围。示例提供的是普通的用户名/密码凭据;BasicCredentialsProvider 这个名字并不强制每次质询都使用 HTTP Basic 方案。

当目标是 HTTPS 时,传输层可以在 CONNECT 期间回应代理质询,此时应用的加密 HTTP 请求尚不存在。通用目标拦截器添加 Proxy-Authorization 并不等同于这一协商。

请分别配置任何目标账户。如果代理仍然拒绝请求,请保留它公布的认证方案以及实际的主机和端口。为其他端点限定的凭据不会仅仅因为密码正确就匹配。

相关文章