WebView の Basic認証 NG時にリトライさせたい - Android Studio
WebView の Basic認証をダイアログ表示させるものの、入力情報が間違っていてもリトライしてくれない
認証エラーは onReceivedHttpError イベントの errorResponse.getStatusCode() == 401 を拾うことで捕捉可能ですが、ページを初めて開いた時も同じ401のイベントが発生するので注意が必要です
下記では authRun をダイアログ入力直後とするフラグを設けて onPageFinished や onReceivedError で解除を行っていますが、もっとスマートな方法は無いものだろうか...
【追記】
上記コードは Android 6.0 (API 23) 以降用でで、それ以前は 同名のイベントが存在するものの...
これが全く使えないイベントで 401時に呼ばれるはするものの errorCode に -1 が入っていたりして判断できるものが全くありません
Basic認証しているということで onReceivedHttpAuthRequest を利用していると思いますが
handler.useHttpAuthUsernamePassword() || authRun とかでとりあえず逃げておいたけど、バージョンで分けるのが正しい方法だと思います
ちなみに、onReceivedHttpAuthRequest には別の落とし穴もあるようで、
ユーザーとパスワードをURL埋め込んで、かつ認証情報が間違っていた場合、このイベント内でいくら正しい認証情報を入れ直したとしても、URLの埋め込みを利用されて全く認証が完了しなかったりします
なので、load時に埋め込み認証情報を分離して、このイベントで投入し直すという方法を取りました
認証エラーは onReceivedHttpError イベントの errorResponse.getStatusCode() == 401 を拾うことで捕捉可能ですが、ページを初めて開いた時も同じ401のイベントが発生するので注意が必要です
下記では authRun をダイアログ入力直後とするフラグを設けて onPageFinished や onReceivedError で解除を行っていますが、もっとスマートな方法は無いものだろうか...
@Override @TargetApi(Build.VERSION_CODES.M) public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { super.onReceivedHttpError(view, request, errorResponse); if( request.isForMainFrame() && (errorResponse.getStatusCode() == 401) && authRun ){ authRun = false; view.reload(); } }
【追記】
上記コードは Android 6.0 (API 23) 以降用でで、それ以前は 同名のイベントが存在するものの...
@Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // < API 23 super.onReceivedError(view, errorCode, description, failingUrl); }
これが全く使えないイベントで 401時に呼ばれるはするものの errorCode に -1 が入っていたりして判断できるものが全くありません
Basic認証しているということで onReceivedHttpAuthRequest を利用していると思いますが
@Override public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { if( (view != null) && handler.useHttpAuthUsernamePassword() ){ } }Android 6.0 (API 23) 以前(4.1で確かめただけで、全て確かめてません)では、認証失敗時(401)にこのイベントが再度呼ばれるようで、しかも handler.useHttpAuthUsernamePassword() に false が入った状態(爆)もぅねぇ
handler.useHttpAuthUsernamePassword() || authRun とかでとりあえず逃げておいたけど、バージョンで分けるのが正しい方法だと思います
ちなみに、onReceivedHttpAuthRequest には別の落とし穴もあるようで、
ユーザーとパスワードをURL埋め込んで、かつ認証情報が間違っていた場合、このイベント内でいくら正しい認証情報を入れ直したとしても、URLの埋め込みを利用されて全く認証が完了しなかったりします
なので、load時に埋め込み認証情報を分離して、このイベントで投入し直すという方法を取りました
コメント