2010-12-27 14 views
13

資格情報を使用して保護されたHTTPS接続を介してWebサイトに接続するAndroid Webviewを作成したいとします。セキュリティで保護されたHTTPS接続を使用してAndroid Webviewで資格情報を設定する

最初の難しさは、証明書(私的)を受け入れることでした。それはthisという非常に便利な投稿で解決されました。

2番目の難点は、資格情報を使用することです。私はthisの投稿を見つけました。

(最初の回答はdparnasですが)それにかなりうまくいくようですが、HTTP接続についてはHTTPSではないと話しています。私はそれを試しましたが、それは動作しません、私はちょうど通常の空白のフォーム、エラーメッセージなしでサインインフォームのページに到達します。ここで

が私のコードです:

import android.app.Activity; 
import android.net.http.SslError; 
import android.os.Bundle; 
import android.webkit.HttpAuthHandler; 
import android.webkit.SslErrorHandler; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

public class ConnectorWebView extends Activity { 
    WebView mWebView; 
    String mUsrName; 
    String mPassC; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.connwebview); 

    // Getting info from Intent extras 
    // Get it if it s different from null 
    Bundle extras = getIntent().getExtras();    
    mUsrName = extras != null ? extras.getString("username") : null; 
    mPassC = extras != null ? extras.getString("passcode") : null; 

    mWebView = (WebView) findViewById(R.id.webview); 
    mWebView.getSettings().setJavaScriptEnabled(true); 
    mWebView.setHttpAuthUsernamePassword("myhost.com", "myrealm", mUsrName, mPassC); 

    mWebView.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, String host, String realm){ 
      handler.proceed(mUsrName, mPassC); 
     } 

     public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { 
      handler.proceed() ; 
     } 
     }); 

    mWebView.loadUrl("https://myhost.com/secured_area"); 
    } 
} 

答えて

3

のWebViewクラスは、直接(例えばHttpPostなど)の低レベルのクラスを使用するなど、その接続のように多くの柔軟性を提供していません。

サーバーへの接続を完全に制御する必要がある場合や、このような複雑な認可シナリオを処理する必要がある場合は、低レベルのクラスを使用してデータを取得し、WebView.loadData()を使用してロードして表示しますHTML。

Hereは、SSLとBasicCredentialProviderを使用してコンテンツをロードする良い例です。この結果は、前述のようにWebViewにロードできます。

+0

それ以上の回答があるようには見えないので、奨励金を授与するつもりです。それを失うことのない点:) –

+0

"複雑な認証シナリオ" haha​​hahhah、これは完全に標準的なRFCから数年前、webviewはこれを処理する必要があります... – Nappy

+0

私はそれを "should"に同意しながら - そして私は望みます! - webviewは、完全なHTTPライブラリがサポートする動作の特定のサブセットを公開するだけです... – elijah

13

それはHTTPSを使用しているときWebViewがネイティブBasic認証を扱うことができないようだと、私は手動で(エンコードされたユーザ名/パスワードを含む)Authorizationヘッダを設定するというアイデアをいじる始めました。ここで

は、私はこれを行うことができると思う方法は次のとおりです。

import org.apache.commons.codec.binary.Base64; 

// ... 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.connwebview); 

    // Getting info from Intent extras 
    // Get it if it s different from null 
    Bundle extras = getIntent().getExtras();    
    mUsrName = extras != null ? extras.getString("username") : null; 
    mPassC = extras != null ? extras.getString("passcode") : null; 

    mWebView = (WebView) findViewById(R.id.webview); 
    mWebView.getSettings().setJavaScriptEnabled(true); 
    // mWebView.setHttpAuthUsernamePassword("myhost.com", 
    //         "myrealm", 
    //         mUsrName, 
    //         mPassC); 

    mWebView.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onReceivedHttpAuthRequest(WebView view, 
              HttpAuthHandler handler, 
              String host, 
              String realm){ 
     handler.proceed(mUsrName, mPassC); 
     } 

     public void onReceivedSslError(WebView view, 
            SslErrorHandler handler, 
            SslError error) { 
     handler.proceed() ; 
     } 
    }); 

    String up = mUserName +":" +mPassC; 
    String authEncoded = new String(Base64.encodeBase64(up.getBytes())); 
    String authHeader = "Basic " +authEncoded; 
    Map<String, String> headers = new HashMap<String, String>(); 
    headers.put("Authorization", authHeader); 
    mWebView.loadUrl("https://myhost.com/secured_area", headers); 
} 

これはWebView.loadUrl (String url, Map<String, String> additionalHttpHeaders)メソッドを利用します。この例のために私はApache CommonsからBase64Encoderを使用しています。 Base64Encoderの部分は非常に簡単です。何らかの理由でアプリケーションに外部ライブラリを含めたくない場合は、いつでもownreference)と書くことができます。

上記のWebView.loadUrl (String url, Map<String, String> additionalHttpHeaders)メソッドは、API 8+でのみ使用できます。参考までに、Basic Authenticationに関するウィキペディアの記事(ヘッダーなどについても説明しています)を参照してください。

+0

素晴らしい解決策!私の場合は、ユーザーが認識されていないときにサーバー自動ログインフォームを実装しているため、webviewclientを使用したソリューションは機能しませんでしたが、ヘッダーマップは正常に動作しています。ありがとう! – Krystian

0

代替シナリオ

roundabout 10 lines of javascript using jQueryを書くために喜んでいる場合は、このシナリオは、かなり単純です。

Inject your javascript code into the webview表示しているhtmlページを制御している場合は、そこに含めます。

interface back from javascriptが必要な場合は、それを行うことができます。より重いコマンド交換の場合は、APIレベルに応じて遅延が遅いCordovaWebView -Interfaceを使用してください。

関連する問題