認証を必要とするJavaのリモートURLに接続するには 次のコードを変更して、プログラムでユーザー名/パスワードを提供できるようにして、401をスローしないようにする方法を見つけようとしています。
URL url = new URL(String.format("http://%s/manager/list", _host + ":8080"));
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
認証を必要とする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をチェックアウトしてください。これにより、より多くの認証オプション(およびセッションサポートなど)が提供されます。
Authenticator
特定のURL.openConnection()
呼び出しごとに特定を設定することは可能ですか?
HttpURLConnection.setAuthenticator()
。残念ながら、Java 8以前では、AuthenticatorインスタンスはJVM全体のグローバル変数です。参照:docs.oracle.com/javase/9/docs/api/java/net/...
ネイティブで邪魔にならない代替手段があり、それはあなたの通話に対してのみ機能します。
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();
.trim()
結果、またはチャンクされた出力を生成しないメソッドバリアントを呼び出さない限り、通常は機能しません。javax.xml.bind.DatatypeConverter
安全のようです。
以下を使用することもできます。外部パッケージを使用する必要はありません。
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();
--add-modules javax.xml.bind
では、デフォルトのクラスパスからパッケージを削除したため、おそらく必要になることに注意してください。また、Java11 +では完全に削除されているため、再び外部依存関係が必要になります。それが進歩です!
java.util.Base64
今があるので、それは確かに進歩です:)
プロトコルとドメインの間にユーザー名とパスワードを入力しながら通常のログインを使用している場合、これはより簡単です。また、ログインの有無にかかわらず動作します。
サンプル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();
valerybodakからのコメントで、Android開発環境でどのように行われるかを以下に注意してください。
url.getUserInfo()
thorugh URLDecoder.decode()
最初(@Peterレーダーを)。
Android-Java-Answerを探してここに来たので、短い要約を行います。
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()」アプローチには十分注意してください。私のチームと私は、Apacheの不正な要求の問題を400件取得しました。生成された文字列の最後に\ r \ nが追加されるためです。
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()));
}
それが役に立てば幸い!
このコードを基本認証に使用します。
URL url = new URL(path);
String userPass = "username:password";
String basicAuth = "Basic " + Base64.encodeToString(userPass.getBytes(), Base64.DEFAULT);//or
//String basicAuth = "Basic " + new String(Base64.encode(userPass.getBytes(), Base64.No_WRAP));
HttpURLConnection urlConnection = (HttpURLConnection)url.openConnection();
urlConnection.setRequestProperty("Authorization", basicAuth);
urlConnection.connect();
接続を開くコードを制御できない場合の回答を提供したいと思います。を使用しURLClassLoader
て、パスワードで保護されたサーバーからjarファイルをロードしたときのように。
Authenticator
解決策は動作しますが、それは最初にパスワードなしとパスワードだけが1つを提供するために、サーバーが要求した後、サーバーに到達しようとするという欠点があるでしょう。サーバーがパスワードを必要とすることがすでにわかっている場合、これは不要なラウンドトリップです。
public class MyStreamHandlerFactory implements URLStreamHandlerFactory {
private final ServerInfo serverInfo;
public MyStreamHandlerFactory(ServerInfo serverInfo) {
this.serverInfo = serverInfo;
}
@Override
public URLStreamHandler createURLStreamHandler(String protocol) {
switch (protocol) {
case "my":
return new MyStreamHandler(serverInfo);
default:
return null;
}
}
}
public class MyStreamHandler extends URLStreamHandler {
private final String encodedCredentials;
public MyStreamHandler(ServerInfo serverInfo) {
String strCredentials = serverInfo.getUsername() + ":" + serverInfo.getPassword();
this.encodedCredentials = Base64.getEncoder().encodeToString(strCredentials.getBytes());
}
@Override
protected URLConnection openConnection(URL url) throws IOException {
String authority = url.getAuthority();
String protocol = "http";
URL directUrl = new URL(protocol, url.getHost(), url.getPort(), url.getFile());
HttpURLConnection connection = (HttpURLConnection) directUrl.openConnection();
connection.setRequestProperty("Authorization", "Basic " + encodedCredentials);
return connection;
}
}
これmy
によりhttp
、資格情報が追加されたときに置き換えられる新しいプロトコルが登録されます。したがって、新しいものを作成するとき、URLClassLoader
単に置き換えhttp
てmy
、すべてうまくいきます。私URLClassLoader
は取るコンストラクタを提供していますURLStreamHandlerFactory
が、このファクトリは、URLがjarファイルを指している場合は使用されません。
Java 9以降、これを行うことができます
URL url = new URL("http://www.example.com");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setAuthenticator(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication ("USER", "PASS".toCharArray());
}
});
setAuthenticator()
メソッドが表示されていません。
ANDROD実装 ユーザー名とパスワードを使用して認証を要求するWebサービスからデータ/文字列応答を要求する完全な方法
public static String getData(String uri, String userName, String userPassword) {
BufferedReader reader = null;
byte[] loginBytes = (userName + ":" + userPassword).getBytes();
StringBuilder loginBuilder = new StringBuilder()
.append("Basic ")
.append(Base64.encodeToString(loginBytes, Base64.DEFAULT));
try {
URL url = new URL(uri);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.addRequestProperty("Authorization", loginBuilder.toString());
StringBuilder sb = new StringBuilder();
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = reader.readLine())!= null){
sb.append(line);
sb.append("\n");
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (null != reader){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
私はあなたがこれをする必要があるようにそれをしました
HttpURLConnection urlConnection;
String url;
// String data = json;
String result = null;
try {
String username ="danish.hussain@gmail.com";
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", "danish.hussain@mee.com");
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();
}