web-dev-qa-db-ja.com

サーバーがHTTP応答コードを返しました:URLの401:https

Javaを使用して、XML形式で表示を返すHTTPSサイトにアクセスします。URL自体にログイン資格情報を渡します。コードスニペットは次のとおりです。

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
requestURL = "https://Administrator:Password@localhost:8443/abcd";

try { 
    InputStream is = null;
    URL url = new URL(requestURL);
    InputStream xmlInputStream =new URL(requestURL).openConnection().getInputStream();
    byte[] testByteArr = new byte[xmlInputStream.available()];
    xmlInputStream.read(testByteArr);
    System.out.println(new String(testByteArr));
    Document doc = db.parse(xmlInputStream);
    System.out.println("DOC="+doc);
} catch (MalformedURLException e) {
} 

署名済み/未署名の証明書を検証しないプログラムで信頼マネージャーを作成しています。ただし、上記のプログラムを実行すると、サーバーがHTTP応答コードを返しました:URLの401: https:// Administrator:Password @ localhost:8443/abcd

ブラウザで同じURLを使用すると、xmlが正しく表示されます。 Javaプログラム内でこの作業を行う方法を教えてください。

17
Vish

401は「許可されていない」ことを意味するため、資格情報が含まれている必要があります。

Java URLは、表示している構文をサポートしていません。代わりにオーセンティケーターを使用できます。

Authenticator.setDefault(new Authenticator() {

    @Override
    protected PasswordAuthentication getPasswordAuthentication() {          
        return new PasswordAuthentication(login, password.toCharArray());
    }
});

そして、資格情報なしで通常のURLを呼び出すだけです。

もう1つのオプションは、ヘッダーで資格情報を提供することです。

String loginPassword = login+ ":" + password;
String encoded = new Sun.misc.BASE64Encoder().encode (loginPassword.getBytes());
URLConnection conn = url.openConnection();
conn.setRequestProperty ("Authorization", "Basic " + encoded);

PS:そのBase64Encoderを使用することはお勧めしませんが、これは簡単な解決策を示すためだけです。そのソリューションを維持したい場合は、そのライブラリを探してください。たくさんあります。

32
Guillaume Polet

これを試して。サーバーに有効なユーザーを知らせるには、認証に合格する必要があります。これらの2つのパッケージをインポートする必要があり、jersy jarを含める必要があります。 jersy jarを含めたくない場合は、このパッケージをインポートします

import Sun.misc.BASE64Encoder;

import com.Sun.jersey.core.util.Base64;
import Sun.net.www.protocol.http.HttpURLConnection;

その後、

String encodedAuthorizedUser = getAuthantication("username", "password");
URL url = new URL("Your Valid Jira URL");
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
httpCon.setRequestProperty ("Authorization", "Basic " + encodedAuthorizedUser );

 public String getAuthantication(String username, String password) {
   String auth = new String(Base64.encode(username + ":" + password));
   return auth;
 }
1
Harshad Holkar