27

App EngineのURLFetchサービス(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の適切なヘッダーは何ですか?

4

6 に答える 6

30

これは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());

そのためには、 ApacheCommonsCodecのようなbase64コーデックAPIを入手する必要があります。

于 2009-09-01T20:10:24.090 に答える
14

Pythonでこれを行うことに興味がある人(私がそうであったように)の場合、コードは次のようになります。

result = urlfetch.fetch("http://www.example.com/comment",
                        headers={"Authorization": 
                                 "Basic %s" % base64.b64encode("username:pass")})
于 2010-07-16T19:06:27.773 に答える
6

このように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);
    }
于 2009-08-30T00:15:46.073 に答える
4

を使用する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()));

これはうまくいきました。

于 2011-05-11T13:16:58.823 に答える
3

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

于 2009-08-31T04:55:43.970 に答える
1

最初の回答に関する注意:setRequestPropertyは、コロンなしでプロパティ名を取得する必要があります( "Authorization:"ではなく "Authorization")。

于 2010-02-01T20:22:45.810 に答える