WebView の Basic認証 NG時にリトライさせたい - Android Studio

WebView の Basic認証をダイアログ表示させるものの、入力情報が間違っていてもリトライしてくれない

認証エラーは onReceivedHttpError イベントの errorResponse.getStatusCode() == 401 を拾うことで捕捉可能ですが、ページを初めて開いた時も同じ401のイベントが発生するので注意が必要です

下記では authRun をダイアログ入力直後とするフラグを設けて onPageFinished や onReceivedError で解除を行っていますが、もっとスマートな方法は無いものだろうか...

  1. @Override  
  2. @TargetApi(Build.VERSION_CODES.M)  
  3. public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {  
  4.       super.onReceivedHttpError(view, request, errorResponse);  
  5.       if( request.isForMainFrame() && (errorResponse.getStatusCode() == 401) && authRun ){  
  6.         authRun = false;  
  7.       view.reload();  
  8.       }  
  9. }  

【追記】
上記コードは Android 6.0 (API 23) 以降用でで、それ以前は 同名のイベントが存在するものの...
  1.               
  2. @Override  
  3. public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { // < API 23  
  4.       super.onReceivedError(view, errorCode, description, failingUrl);  
  5.   
  6. }  

これが全く使えないイベントで 401時に呼ばれるはするものの errorCode に -1 が入っていたりして判断できるものが全くありません

Basic認証しているということで onReceivedHttpAuthRequest を利用していると思いますが
  1. @Override  
  2. public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {  
  3.     if( (view != null) && handler.useHttpAuthUsernamePassword() ){  
  4.       
  5.     }  
  6. }  
Android 6.0 (API 23) 以前(4.1で確かめただけで、全て確かめてません)では、認証失敗時(401)にこのイベントが再度呼ばれるようで、しかも handler.useHttpAuthUsernamePassword() に false が入った状態(爆)もぅねぇ
handler.useHttpAuthUsernamePassword() || authRun とかでとりあえず逃げておいたけど、バージョンで分けるのが正しい方法だと思います

ちなみに、onReceivedHttpAuthRequest には別の落とし穴もあるようで、
ユーザーとパスワードをURL埋め込んで、かつ認証情報が間違っていた場合、このイベント内でいくら正しい認証情報を入れ直したとしても、URLの埋め込みを利用されて全く認証が完了しなかったりします
なので、load時に埋め込み認証情報を分離して、このイベントで投入し直すという方法を取りました


コメント