web-dev-qa-db-ja.com

HttpUrlConnectionによるプリエンプティブ基本認証?

HttpUrlConnectionを使用してプリエンプティブな基本的なhttp認証を使用する最良の方法は何ですか。 (今のところ、HttpClientを使用できないと想定しています)。

明確化のための編集:Base64エンコーディングを使用して、リクエストヘッダーでun/pwを正しく設定しています。設定する必要がある追加のフラグまたはプロパティはありますか、または要求の基本認証ヘッダーをプリエンプティブ基本認証に必要なすべてを設定しているという事実ですか?

41
Dave Sims

Java 8以降を使用している場合、Java.util.Base64は使用可能です:

HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
String encoded = Base64.getEncoder().encodeToString((username+":"+password).getBytes(StandardCharsets.UTF_8));  //Java 8
connection.setRequestProperty("Authorization", "Basic "+encoded);


その後、接続を通常どおり使用します。

Java 7以下を使用している場合は、次のような文字列をBase64にエンコードするメソッドが必要です。

byte[] message = (username+":"+password).getBytes("UTF-8");
String encoded = javax.xml.bind.DatatypeConverter.printBase64Binary(message);

はい、基本認証を使用するために必要なのはこれだけです。上記のリクエストプロパティを設定するコードは、接続を開いた直後、入力ストリームまたは出力ストリームを取得する前に実行する必要があります。

109
dontocsata

ちなみに、他の誰かが同じ問題に遭遇した場合、Android問題、_org.Apache.commons.codec.binary.Base64_を使用してBase64.encodeBase64String()を実行した場合にも発生します。Base64.encodeBase64()とbyte []を取得して、文字列を作成します。

結果は、これらの2つの方法の間で終了する行では異なるものになるということをまったく気に留めていませんでした。

3
dawson

Java.net.Authenticator を使用して、基本認証を構成できます。アプリケーションが送信するすべてのリクエストについてグローバルに参照してください。

2
avianey

あなたはこれをコピーして貼り付ける必要があります

    HttpURLConnection urlConnection;
    String url;
 //   String data = json;
    String result = null;
    try {
        String username ="[email protected]";
        String password = "12345678";

        String auth =new String(username + ":" + password);
        byte[] data1 = auth.getBytes(UTF_8);
        String base64 = Base64.encodeToString(data1, Base64.NO_WRAP);
        //Connect
        urlConnection = (HttpURLConnection) ((new URL(urlBasePath).openConnection()));
        urlConnection.setDoOutput(true);
        urlConnection.setRequestProperty("Content-Type", "application/json");
        urlConnection.setRequestProperty("Authorization", "Basic "+base64);
        urlConnection.setRequestProperty("Accept", "application/json");
        urlConnection.setRequestMethod("POST");
        urlConnection.setConnectTimeout(10000);
        urlConnection.connect();
        JSONObject obj = new JSONObject();

        obj.put("MobileNumber", "+97333746934");
        obj.put("EmailAddress", "[email protected]");
        obj.put("FirstName", "Danish");
        obj.put("LastName", "Hussain");
        obj.put("Country", "BH");
        obj.put("Language", "EN");
        String data = obj.toString();
        //Write
        OutputStream outputStream = urlConnection.getOutputStream();
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
        writer.write(data);
        writer.close();
        outputStream.close();
        int responseCode=urlConnection.getResponseCode();
        if (responseCode == HttpsURLConnection.HTTP_OK) {
            //Read
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));

        String line = null;
        StringBuilder sb = new StringBuilder();

        while ((line = bufferedReader.readLine()) != null) {
            sb.append(line);
        }

        bufferedReader.close();
        result = sb.toString();

        }else {
        //    return new String("false : "+responseCode);
        new String("false : "+responseCode);
        }

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }
2

私もこの問題を抱えていました。そして今、私はこの問題を解決しました。私のコードは:

    URL url = new URL(stringUrl);

    String authStr = "MyAPIKey"+":"+"Password";
    System.out.println("Original String is " + authStr);

 // encode data on your side using BASE64
    byte[] bytesEncoded = Base64.encodeBase64(authStr .getBytes());
    String authEncoded = new String(bytesEncoded);

    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setRequestProperty("Authorization", "Basic "+authEncoded);

それは他の多くの人を助けるかもしれません。幸運を祈ります。

1