Задать учетные данные в веб-представлении Android с помощью защищенного соединения HTTPS - PullRequest
13 голосов
/ 27 декабря 2010

Я хотел бы создать Android Webview, который подключается к веб-сайту через защищенное HTTPS соединение с использованием учетных данных.

Первая трудность состояла в том, чтобы принять сертификат (частный), он был решен с помощью этот очень полезный пост.

Вторая сложность заключается в использовании учетных данных, я нашел этот пост.

(первый ответ от 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 ]

14 голосов
/ 09 января 2012

Поскольку кажется, что WebView не может обрабатывать Basic аутентификацию при использовании HTTPS, я начал задумываться о том, чтобы вручную установить заголовок 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), и для этого примера я использую Base64Encoder из Apache Commons . Часть Base64Encoder довольно тривиальна, и если вы не хотите включать внешние библиотеки в ваше приложение (по какой-либо причине), вы всегда можете написать own ( reference ).

Также обратите внимание, что вышеупомянутый метод WebView.loadUrl (String url, Map<String, String> additionalHttpHeaders) доступен только в API 8+. Для справки см. Также статью в Википедии о Basic Authentication (в которой обсуждаются заголовки и т. Д.).

3 голосов
/ 06 января 2012

Класс WebView не обеспечивает такой гибкости в подключении, как непосредственное использование классов низкого уровня (таких как HttpPost и т. П.).

Если вам необходимо полностью контролировать соединение с сервером -- или иметь дело со сложными сценариями авторизации, такими как этот - используйте низкоуровневые классы, извлеките данные, затем используйте WebView.loadData () для загрузки и отображения HTML.

Здесь хороший пример загрузки контента с использованием SSL и BasicCredentialProvider.Результат этого может быть загружен в WebView, как описано выше.

0 голосов
/ 04 апреля 2014

Альтернативный сценарий :

Если вы хотите написать около 10 строк javascript с использованием jQuery , этот сценарий довольно прост.

Вставьте свой код JavaScript в веб-просмотр или, если вы управляете отображаемой HTML-страницей, добавьте ее туда.

Если вам нужен интерфейс обратно из javascript , вы можете сделать это. Для более тяжелого обмена командами используйте CordovaWebView -интерфейс, который имеет меньшую задержку в зависимости от уровня API.

...