首页 > 解决方案 > Java\Groovy - java.io.IOException:简单的经过身份验证的 HTTP 请求中的身份验证失败

问题描述

我正在使用 Groovy\Java。我正在尝试使用简单的 HTTP GET 从服务器下载文件。此代码适用于我们尝试过的每台计算机,但我同事的计算机除外。

new File(fullFilePath).withOutputStream { out ->

            url = new URL(COMPLETE_URL).openConnection() 

            Authenticator.setDefault (new Authenticator() {
                            protected PasswordAuthentication getPasswordAuthentication() {
                                return new PasswordAuthentication (USER, PASSWORD);
                            }
                        });

                out << url.inputStream
            }

奇怪的是,此代码在我的计算机和 AWS 实例、Windows 10 和 Windows Server 2012 上完美运行,但它不适用于我同事的计算机、Windows 10。全部为 64 位。

我们都有相同的 Java 版本。防病毒和防火墙已禁用。我尝试了他的凭据,他尝试了我的凭据,但它仍然不能仅在他的计算机上运行。

错误:

java.io.IOException: Authentication failure
  at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1695)
  at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1439)
...

我们还能尝试检查什么?

标签: javahttpauthenticationgroovy

解决方案


使用Authenticator.setDefault()是一种不好的方法。它将导致 Java 在 JVM 发出请求凭据的任何请求时发送您的用户名和密码。

为什么这仅在一台机器上失败很难说,但很可能 Java 配置必须不同。

无论如何,请尝试更改您的代码以仅在每个请求上设置身份验证标头。这将使您的代码减少对 Java 内部的依赖,并且不会仅在 JVM 将来可能发出的每个请求上发送您的凭据:

def authHeaderValue = 'Basic ' + Base64.encoder.encodeToString("$USER:$PASSWORD".bytes)

new File(fullFilePath).withOutputStream { out ->
    connection = new URL(COMPLETE_URL).openConnection()
    connection.setRequestProperty('Authorization', authHeaderValue)
    out << connection.inputStream
}

我写了一篇关于在没有库的情况下在 Groovy 中发出 HTTP 请求的博文,您可能想查看一下。


推荐阅读