Android 4.0 でのWebView上でのBasic認証について

5,161 views
Skip to first unread message

potaka

unread,
Mar 8, 2012, 5:56:18 AM3/8/12
to Android-SDK-Japan
製作中のWebViewを使ったアプリでBasic認証を行なっているのですが、Android 2.3.* 端末では
なんの問題もなく、サーバー側でもBasic認証が行われていることを確認できているのですが、
GALAXY NEXUS(Android 4.0.2)ではBasic認証のユーザー名とパスワードが無くなっている
ようなのです。

次のように行なっております。

ーーー
HttpGet method = new HttpGet( domain + "?" + params );

DefaultHttpClient client = new DefaultHttpClient();

// Basic認証の設定
UsernamePasswordCredentials credentials = new
UsernamePasswordCredentials("hoge", "pass");
AuthScope scope = new AuthScope(domain, 80);
client.getCredentialsProvider().setCredentials(scope, credentials);

// ヘッダを設定する
method.setHeader( "Connection", "Keep-Alive" );

// 通信
HttpResponse response = client.execute( method );
int status = response.getStatusLine().getStatusCode();
if ( status != HttpStatus.SC_OK )
throw new Exception( "" );
ーーー

なにかご存知の方はいらっしゃいませんか?

Keiji Ariyama

unread,
Mar 8, 2012, 7:40:41 AM3/8/12
to android-...@googlegroups.com
有山と申します。

> 製作中のWebViewを使ったアプリでBasic認証を行なっているのですが、
Android 2.3.* 端末では
> なんの問題もなく、サーバー側でもBasic認証が行われていることを確認でき
ているのですが、
> GALAXY NEXUS(Android 4.0.2)ではBasic認証のユーザー名とパスワードが無
くなっている
> ようなのです。

 無くなっているという部分をきちんと理解したいのですが、どのような状況で
しょうか。

・Eclipseでエラーが出る
・Eclipseではエラーは出ないが、Basic認証が出来ない

 サーバーからのレスポンスはどのようになっていますか。または、プログラム
実行中に例外が出ていませんか?

--
Keiji,
ml_an...@c-lis.co.jp

potaka

unread,
Mar 8, 2012, 8:44:36 PM3/8/12
to Android-SDK-Japan
Eclipseにエラーは出ていません。
実行中に例外も発生していません。

Android 2.3.*の端末では問題なくWebViewにWebページが表示されます。
Android 4.*ではステータスコード401が帰ってきます。
> ml_andr...@c-lis.co.jp

Keiji Ariyama

unread,
Mar 9, 2012, 3:14:55 AM3/9/12
to android-...@googlegroups.com
有山です。

 401 と言うことは、認証に失敗していると言うことですね。。。

 こちらで同様の現象が発生していないのでこれという原因がわからないのです
が、AuthScopeのあたりが怪しいのではないかと考えています。

>> HttpGet method = new HttpGet( domain + "?" + params );

 変数domainの中身は、ドキュメントを見る限りパスを含まないhost名という理
解ですが、ここに余計な文字列が入ったりしていないでしょうか。

AuthScope
http://developer.android.com/reference/org/apache/http/auth/AuthScope.html

CredentialsProviderには大きな変更がないようなので、AuthScopeと
Credentialはきちんと登録されているように思えます。
 登録は出来ても、アクセス先のhostやポートその他とAuthScopeが適合してい
ないので、認証が出来ていないのではないかと推測しています。

 ちなみに僕は、Basic認証はHttpURLConnectionでやっています。一部を抜き出
しておいておきますね。

https://gist.github.com/2005616

--
Keiji,
ml_an...@c-lis.co.jp

potaka

unread,
Mar 9, 2012, 6:51:43 AM3/9/12
to Android-SDK-Japan
HttpGetを使用しているのですが、直接URLに付ける方法を試してみます。
参考コード上げて頂きましてありがとう御座いました。

気になるのはAndroid 2.3.*端末では動いていて、Android 4.*では動いていない点です。

デバッガでステップ実行し、URLなどは確認しているので問題はありません。
「WebViewClient」内の「onReceivedHttpAuthRequest」で
「getHttpAuthUsernamePassword」の返す配列にユーザー名とパスワードが入ってこないのです。
これがAndroid 2.3.*端末ではちゃんと入ってくるので、認証を通っています。

On 3月9日, 午後5:14, Keiji Ariyama <ml_andr...@c-lis.co.jp> wrote:
> 有山です。
>
>  401 と言うことは、認証に失敗していると言うことですね。。。
>
>  こちらで同様の現象が発生していないのでこれという原因がわからないのです
> が、AuthScopeのあたりが怪しいのではないかと考えています。
>
> >> HttpGet method = new HttpGet( domain + "?" + params );
>
>  変数domainの中身は、ドキュメントを見る限りパスを含まないhost名という理
> 解ですが、ここに余計な文字列が入ったりしていないでしょうか。
>
> AuthScopehttp://developer.android.com/reference/org/apache/http/auth/AuthScope...
> ml_andr...@c-lis.co.jp

Keiji Ariyama

unread,
Mar 9, 2012, 7:40:25 AM3/9/12
to android-...@googlegroups.com
有山です。

> 「WebViewClient」内の「onReceivedHttpAuthRequest」で
> 「getHttpAuthUsernamePassword」の返す配列にユーザー名とパスワードが
入ってこないのです。
> これがAndroid 2.3.*端末ではちゃんと入ってくるので、認証を通っています。

 あれ、少し整理させてください。

・UsernamePasswordCredentialsやHttpResponseは、org.apache.httpライブラリ
の一部です。
・WebViewClientは、WebViewから取り扱います。

 両者は別物なので、org.apache.httpライブラリから認証情報を設定したから
といって、自動的にWebView側に反映されるという事ではないという理解でいま
す(間違っていたら誰か突っ込みください)。

 なので、最初ソースコードを拝見したときは、org.apache.httpで認証して、
レスポンスのHTMLをString型などで取得したものを、WebViewに流し込んで表示
しているものと想定していましたが、いかがでしょうか。

 org.apache.httpで取得した場合、WebViewはHTMLを表示するだけなので認証は
発生せず、結果としてonReceivedHttpAuthRequestは呼ばれないし、当然
getHttpAuthUsernamePasswordも使う必要はないと思うのですが。。。

 もしgetHttpAuthUsernamePasswordで認証情報を戻したいなら、事前に
setHttpAuthUsernamePasswordで値を設定する必要があるのではないでしょうか。

--
Keiji,
ml_an...@c-lis.co.jp

potaka

unread,
Mar 12, 2012, 2:06:15 AM3/12/12
to Android-SDK-Japan
失礼いたしました。
有山さんのおっしゃる通りで、私の方でもごちゃごちゃしてしまいました。

なので、サンプルを作ってみました。
そのおかげか、冷静に確認することができ、原因がわかりました。
https://github.com/potaka001/WebViewBasicAuthTest

このサンプルは「MainActivity.java」でBasic認証サーバーの設定をする必要があります。
Android 4.*ではBasic認証を手動で行うようダイアログを表示するようにしました。

「MyWebViewClient.java」onReceivedHttpAuthRequest、74行目、hostを確認すると、
Android 4.*ではポート番号が勝手に付けられていることがわかりました。(付けないようにする方法あるんですかね?)




その為、ユーザー名とパスワードを持ってこれなかったようです。
「MainActivity.java」内のsetHttpAuthUsernamePasswordで設定したHOSTにポート番号は無いので。

根本的な解決にはいたっていませんが、ここまでお付き合いしていただきありがとう御座いました。>有山さん

仕方がないのでポート番号を正規表現で削除するなどの処理を入れたいと思います。

ありがとう御座いました。
> ml_andr...@c-lis.co.jp
Reply all
Reply to author
Forward
0 new messages