【问题标题】:connect to a URL using Basic authentication in Java - java.net.ConnectException: Connection refused: connect使用 Java 中的基本身份验证连接到 URL - java.net.ConnectException:连接被拒绝:连接
【发布时间】:2015-08-11 08:52:16
【问题描述】:

我正在尝试连接到需要基本身份验证的网站,但我收到 java.net.ConnectException:连接被拒绝:连接并且我无法获取内容,基本身份验证依赖于 Base64 编码的“授权”标头,其值包含单词“Basic”,后跟一个空格,后跟 Base64 编码的名称:密码。当然,使用浏览器我得到了我想要的正确的 json 文件

    public static void main(String[] args) {

            try {

System.setProperty("http.proxyHost", PROXY_HOST);
            System.setProperty("http.proxyPort", PROXY_PORT);
            setAuthenticator();

                String webPage = "https://foo.com/developers/apps.json";


                String name = "myUserName";
                String password = "myPassword";

                String authString = name + ":" + password;
                System.out.println("auth string: " + authString);
                byte[] authEncBytes = Base64.encodeBase64(authString.getBytes());
                String authStringEnc = new String(authEncBytes);
                System.out.println("Base64 encoded auth string: " + authStringEnc);

                URL url = new URL(webPage);
                URLConnection urlConnection = url.openConnection();

                String encoded = new String (base64Encode(new String("j0a3t:d3jk6ft")));
                urlConnection.setRequestProperty("Proxy-Authorization", "Basic " + encoded);

                urlConnection.setRequestProperty("Authorization", "Basic " + authStringEnc);
                InputStream is = urlConnection.getInputStream();
                InputStreamReader isr = new InputStreamReader(is);

                int numCharsRead;
                char[] charArray = new char[1024];
                StringBuffer sb = new StringBuffer();
                while ((numCharsRead = isr.read(charArray)) > 0) {
                    sb.append(charArray, 0, numCharsRead);
                }
                String result = sb.toString();

                System.out.println("*** BEGIN ***");
                System.out.println(result);
                System.out.println("*** END ***");
            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

我用这个其他程序得到了同样的结果:

public class Application {

    public static void main(String[] args) throws ClientProtocolException, IOException {


        DefaultHttpClient httpclient = new DefaultHttpClient();

         HttpHost target = new HttpHost("foo.com", 80, "http");
         HttpGet getRequest = new HttpGet("/developers/apps.json");

         HttpResponse httpResponse = httpclient.execute(target, getRequest);
         HttpEntity entity = httpResponse.getEntity();

    }
}

这里是 printStackTrace:

Base64 encoded auth string: cmljYXJkLm9sbGVAZ21hBWwuY25tOkljb17vZmNvaWwxMDA=
java.net.ConnectException: Connection refused: connect
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    at java.net.Socket.connect(Socket.java:529)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:564)
    at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.connect(BaseSSLSocketImpl.java:141)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:163)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:395)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:530)
    at sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:272)
    at sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:329)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:172)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:158)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1172)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234)
    at com.sigfox.tests.ConnectToUrlUsingBasicAuthentication.main(ConnectToUrlUsingBasicAuthentication.java:46)

【问题讨论】:

  • 请添加完整的堆栈跟踪。
  • 你能通过任何客户端来测试 url 这个 REST 像 RESTClient 或 SOAP UI 等吗?你试过了吗?

标签: java url authentication http-headers basic-authentication


【解决方案1】:

注意区分 ProxyAuthentication 和 URI 身份验证。

这里有一个 uri 身份验证示例 [如果你需要在 URI 上进行身份验证 ]:

        BASE64Encoder encoder = new BASE64Encoder();//import sun.misc.BASE64Encoder;
        String authString = name + ":" + password;
        String authStringEncoded = encoder.encode(authString.getBytes());
        setHeader("Authorization", "Basic " + authStringEncoded);

这用于代理身份验证[如果你需要通过代理上网]:

            BASE64Encoder encoder = new BASE64Encoder();
            String authString = name + ":" + password;
            String authStringEncoded = encoder.encode(authString.getBytes());
            setHeader("Proxy-Authorization", "Basic " + authStringEncoded);

也许,您也可以探测 Apache 实用程序以获取正确的编码用户名/密码

类似这样的伪代码:

Header  auth_header=
 new DigestScheme().authenticate(new UsernamePasswordCredentials(authUser.asString(),
                                                                 authPwd.asString()),
                                                       commonsHttpRequest,
                                                       new BasicHttpContext());

之后,只是:

urlConnection.setRequestProperty("授权", auth_header.getValue());

【讨论】:

    【解决方案2】:

    初步看来,它看起来像是代理身份验证错误。尝试使用 Apache HC 4.x 进行检查,Apache document

    如果您使用的是 Windows 代理服务器,请尝试使用 NTLM 身份验证(第 4.7 节)

    对于第一次通过尝试通过添加授权标头(就像您在代码中所做的那样)进行抢先式身份验证,这样您就可以跳过 401 和身份验证周期。

    【讨论】:

      【解决方案3】:

      尝试删除这些行

      System.setProperty("http.proxyHost", PROXY_HOST);
      System.setProperty("http.proxyPort", PROXY_PORT);
      

      如果是代理问题会显示。

      【讨论】:

      • 删除它,同样的问题 :-(
      猜你喜欢
      • 2017-08-10
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 2014-05-17
      • 2013-11-05
      • 2023-03-21
      • 2015-05-18
      相关资源
      最近更新 更多