对于提供 Basic 认证的 HTTP 代理,OkHttp 的 proxyAuthenticator 可以返回一个携带凭据的请求。在授权尝试已被拒绝之后返回 null,而不是再次发送相同的应答:

.proxyAuthenticator { _, response ->
    if (response.request.header("Proxy-Authorization") != null) {
        null
    } else {
        response.request.newBuilder()
            .header("Proxy-Authorization",
                    Credentials.basic(proxyUser, proxyPassword))
            .build()
    }
}

这段示例使用应用程序机密配置中的账号值。该防护允许首次尝试并阻止重复尝试。它实现的是 Basic,而不是代理可能宣告的每一种方案;在选择该应答之前,请先检查挑战内容。

如果最终结果仍是 407,请比较所选代理、宣告的方案和文档记录的账号身份。被拒绝的密码、不受支持的方法和错误的用户名形式需要不同的修正。请将这些观察结果和最终状态保留在已脱敏的诊断信息中。

CONNECT 还有另一种回调上下文:在打开隧道之前,OkHttp 会记录一个合成的抢先式代理认证挑战。请按照 API 处理该上下文,而不要假设每次回调都代表普通的目的响应。

单独的 authenticator 用于目标服务器认证。请将其凭据与代理登录分开;一个把代理密码加到每个出站请求上的通用拦截器可能会在错误的范围内发送它。

历史报告也描述了实现缺陷,包括对被拒绝的代理响应正文的处理。在把当前故障归因于旧报告之前,请记录 OkHttp 版本和最终交互。重试决策仍应阻止没有有用新应答的未改变凭据尝试。

相关文章