web-dev-qa-db-ja.com

AndroidでHTTP認証を行う方法

クラスorg.Apache.http.authをチェックアウトしています。誰かが持っている場合、それ以上の参照や例はありますか?

71
Bohemian

以前にその特定のパッケージに出会ったことはありませんが、クライアント側のHTTP認証用であり、Androidを使用してJava.net次のようなAPI:

Authenticator.setDefault(new Authenticator(){
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("myuser","mypass".toCharArray());
    }});
HttpURLConnection c = (HttpURLConnection) new URL(url).openConnection();
c.setUseCaches(false);
c.connect();

明らかに、getPasswordAuthentication()はおそらく定数を返すよりもインテリジェントな処理を行う必要があります。

認証付きのボディ(例:POST)でリクエストを作成しようとしている場合、 Android issue 4326 に注意してください。そこに提案された修正をプラットフォームにリンクしましたが、基本認証のみが必要な場合は簡単な回避策があります:Authenticatorに煩わされず、代わりにこれを行います:

c.setRequestProperty("Authorization", "basic " +
        Base64.encode("myuser:mypass".getBytes(), Base64.NO_WRAP));
78
Chris Boyle

私にとっては、うまくいきました。

final String basicAuth = "Basic " + Base64.encodeToString("user:password".getBytes(), Base64.NO_WRAP);

Apache HttpCLient:

request.setHeader("Authorization", basicAuth);

HttpUrlConnection:

connection.setRequestProperty ("Authorization", basicAuth);
116
cesards

リクエストに手動でhttpヘッダーを挿入できます:

HttpGet request = new HttpGet(...);
request.setHeader("Authorization", "Basic "+Base64.encodeBytes("login:password".getBytes()));
14
Dmitry Sitnikov

手動メソッドは、Android.util.Base64のインポートでうまく機能しますが、エンコードの呼び出し時にBase64.NO_WRAPを設定するようにしてください。

String basicAuth = "Basic " + new String(Base64.encode("user:pass".getBytes(),Base64.NO_WRAP ));
connection.setRequestProperty ("Authorization", basicAuth);
12
GWu

Androidプロジェクトの場合、ここからBase64ライブラリを使用しました。

http://iharder.net/base64

これは非常に大規模なライブラリであり、今のところ問題はありません。

3
Oke Uwechue

これは私のために働く

 URL imageUrl = new URL(url);
                    HttpURLConnection conn = (HttpURLConnection) imageUrl
                            .openConnection();
                    conn.setRequestProperty("Authorization", "basic " +
                            Base64.encode("username:password".getBytes()));
                    conn.setConnectTimeout(30000);
                    conn.setReadTimeout(30000);
                    conn.setInstanceFollowRedirects(true);
                    InputStream is = conn.getInputStream();
1