Java \ Groovy - java.io.IOException:简单的经过身份验证的HTTP请求中的身份验证失败

时间:2018-05-04 09:06:57

标签: java http authentication groovy

我正在使用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)
...

我们还可以尝试检查什么?

1 个答案:

答案 0 :(得分:0)

使用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请求的blog post,你可能想要查看它。