[java] Java를 사용하여 인증이 필요한 원격 URL에 연결

인증이 필요한 Java의 원격 URL에 어떻게 연결합니까? 프로그래밍 방식으로 사용자 이름 / 암호를 제공 할 수 있도록 다음 코드를 수정하여 401이 발생하지 않도록하는 방법을 찾으려고합니다.

URL url = new URL(String.format("http://%s/manager/list", _host + ":8080"));
HttpURLConnection connection = (HttpURLConnection)url.openConnection();



답변

다음과 같이 http 요청에 대한 기본 인증자를 설정할 수 있습니다.

Authenticator.setDefault (new Authenticator() {
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication ("username", "password".toCharArray());
    }
});

또한 더 많은 유연성이 필요한 경우 Apache HttpClient를 확인하여 더 많은 인증 옵션 (세션 지원 등)을 제공 할 수 있습니다.


답변

귀하의 통화에만 작동하는 기본적이고 덜 방해가되지 않는 대안이 있습니다.

URL url = new URL(“location address”);
URLConnection uc = url.openConnection();
String userpass = username + ":" + password;
String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes()));
uc.setRequestProperty ("Authorization", basicAuth);
InputStream in = uc.getInputStream();


답변

외부 패키지를 사용할 필요가없는 다음을 사용할 수도 있습니다.

URL url = new URL(“location address”);
URLConnection uc = url.openConnection();

String userpass = username + ":" + password;
String basicAuth = "Basic " + javax.xml.bind.DatatypeConverter.printBase64Binary(userpass.getBytes());

uc.setRequestProperty ("Authorization", basicAuth);
InputStream in = uc.getInputStream();


답변

프로토콜과 도메인 사이에 사용자 이름과 암호를 입력하는 동안 일반 로그인을 사용하는 경우 더 간단합니다. 또한 로그인 유무에 관계없이 작동합니다.

샘플 URL : http : // user : pass@domain.com/url

URL url = new URL("http://user:pass@domain.com/url");
URLConnection urlConnection = url.openConnection();

if (url.getUserInfo() != null) {
    String basicAuth = "Basic " + new String(new Base64().encode(url.getUserInfo().getBytes()));
    urlConnection.setRequestProperty("Authorization", basicAuth);
}

InputStream inputStream = urlConnection.getInputStream();

Android 개발 환경에서 수행되는 방법 아래의 valerybodak의 의견에 유의하십시오.


답변

Android-Java-Answer를 찾고 여기에 왔으므로 간단한 요약을 할 것입니다.

  1. James van Huis가 표시 한대로 java.net.Authenticator 사용
  2. 이 답변 에서와 같이 Apache Commons HTTP Client 사용
  3. 기본 java.net.URLConnection을 사용 하고 여기에 표시된 것과 같이 수동으로 인증 헤더를 설정 하십시오.

Android 에서 기본 인증과 함께 java.net.URLConnection 을 사용하려면 다음 코드를 시도하십시오.

URL url = new URL("http://www.mywebsite.com/resource");
URLConnection urlConnection = url.openConnection();
String header = "Basic " + new String(android.util.Base64.encode("user:pass".getBytes(), android.util.Base64.NO_WRAP));
urlConnection.addRequestProperty("Authorization", header);
// go on setting more request headers, reading the response, etc


답변

HttpsURLConnection을 사용하여 인증을 설정할 수있었습니다.

           URL myUrl = new URL(httpsURL);
            HttpsURLConnection conn = (HttpsURLConnection)myUrl.openConnection();
            String userpass = username + ":" + password;
            String basicAuth = "Basic " + new String(Base64.getEncoder().encode(userpass.getBytes()));
            //httpsurlconnection
            conn.setRequestProperty("Authorization", basicAuth);

이 게시물에서 가져온 변경 사항 중 일부입니다. Base64는 java.util 패키지에서 가져온 것입니다.


답변

“Base64 (). encode ()”접근 방식에주의하십시오. 우리 팀과 저는 생성 된 문자열 끝에 \ r \ n을 추가하기 때문에 400 개의 Apache 잘못된 요청 문제가 발생했습니다.

Wireshark 덕분에 패킷 스니핑을 발견했습니다.

우리의 해결책은 다음과 같습니다.

import org.apache.commons.codec.binary.Base64;

HttpGet getRequest = new HttpGet(endpoint);
getRequest.addHeader("Authorization", "Basic " + getBasicAuthenticationEncoding());

private String getBasicAuthenticationEncoding() {

        String userPassword = username + ":" + password;
        return new String(Base64.encodeBase64(userPassword.getBytes()));
    }

도움이 되었기를 바랍니다.