App Engineの RLFetch サービス(Java)でBasic-Authリクエストを行うためのユーザー名とパスワードを指定するにはどうすればよいですか?
HTTPヘッダーを設定できるようです。
URL url = new URL("http://www.example.com/comment");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("X-MyApp-Version", "2.7.3");
Basic-Authの適切なヘッダーは何ですか?
これはhttp上の基本認証ヘッダーです:
承認:基本的なbase64エンコード(ユーザー名:パスワード)
例えば:
GET /private/index.html HTTP/1.0
Host: myhost.com
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
これを行う必要があります:
URL url = new URL("http://www.example.com/comment");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("Authorization",
"Basic "+codec.encodeBase64String(("username:password").getBytes());
そのためには、 Apache Commons Codec のようなbase64コーデックAPIを取得する必要があります。
Python(私がそうであったように)でこれを行うことに興味がある人にとって、コードは次のようになります:
result = urlfetch.fetch("http://www.example.com/comment",
headers={"Authorization":
"Basic %s" % base64.b64encode("username:pass")})
このようにopenConnection()を呼び出す前に、オーセンティケーターを設定します。
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password.toCharArray());
}
});
グローバルなデフォルトオーセンティケーターは1つしかないため、複数のユーザーが複数のスレッドでURLFetchを実行している場合、これは実際にはうまく機能しません。その場合は、ApacheHttpClientを使用します。
編集:私は間違っていました。 AppEngineはオーセンティケーターを許可していません。許可されている場合でも、グローバルオーセンティケーターインスタンスでマルチスレッドの問題が発生します。スレッドを作成できない場合でも、リクエストは別のスレッドで処理される可能性があります。したがって、この関数を使用してヘッダーを手動で追加するだけです。
import com.google.appengine.repackaged.com.google.common.util.Base64;
/**
* Preemptively set the Authorization header to use Basic Auth.
* @param connection The HTTP connection
* @param username Username
* @param password Password
*/
public static void setBasicAuth(HttpURLConnection connection,
String username, String password) {
StringBuilder buf = new StringBuilder(username);
buf.append(':');
buf.append(password);
byte[] bytes = null;
try {
bytes = buf.toString().getBytes("ISO-8859-1");
} catch (Java.io.UnsupportedEncodingException uee) {
assert false;
}
String header = "Basic " + Base64.encode(bytes);
connection.setRequestProperty("Authorization", header);
}
HttpURLConnection
を使用すると、いくつかの問題が発生し(何らかの理由で、接続しようとしたサーバーが認証情報を受け入れませんでした)、最終的に、GAEの低レベルURLFetch APIを使用する方が実際にははるかに簡単であることに気付きました( com.google.appengine.api.urlfetch
) そのようです:
URL fetchurl = new URL(url);
String nameAndPassword = credentials.get("name")+":"+credentials.get("password");
String authorizationString = "Basic " + Base64.encode(nameAndPassword.getBytes());
HTTPRequest request = new HTTPRequest(fetchurl);
request.addHeader(new HTTPHeader("Authorization", authorizationString));
HTTPResponse response = URLFetchServiceFactory.getURLFetchService().fetch(request);
System.out.println(new String(response.getContent()));
これはうまくいきました。
AppEngine用のApacheHttpClientにラッパーがあります
投稿をご覧ください http://esxx.blogspot.com/2009/06/using-apaches-httpclient-on-google-app.html
http://peterkenji.blogspot.com/2009/08/using-Apache-httpclient-4-with-google.html
最初の回答に関する注意:setRequestPropertyは、コロンなしでプロパティ名を取得する必要があります( "Authorization:"ではなく "Authorization")。