Установка учетных данных в веб-обозревателе Android с использованием защищенного соединения HTTPS
Я хотел бы создать 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");
}
}
Ответы
Ответ 1
Похоже, что 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 довольно тривиальна, и если вы не хотите включать внешние библиотеки в свое приложение (по какой-либо причине), вы всегда можете написать свой собственный (ссылка).
Также обратите внимание, что вышеупомянутый метод WebView.loadUrl (String url, Map<String, String> additionalHttpHeaders)
доступен только в API 8+. Для справки см. Также статью Википедии о Базовая аутентификация (в которой обсуждаются заголовки и т.д.).
Ответ 2
Класс WebView не обеспечивает такую гибкость в его подключении, как использование низкоуровневых классов (таких как HttpPost и т.п.) напрямую.
Если вам нужно полностью контролировать соединение с сервером - или иметь дело со сложными сценариями авторизации, такими как этот, - использовать классы низкого уровня, извлекать данные, а затем использовать WebView.loadData() для загрузки и отображения HTML.
Здесь является хорошим примером загрузки контента с использованием SSL и BasicCredentialProvider. Результат этого может быть загружен в WebView, как описано выше.
Ответ 3
Альтернативный сценарий:
Если вы хотите написать окольный 10 строк javascript, используя jQuery, этот сценарий довольно прост.
Внесите свой javascript-код в веб-просмотр или в случае, если вы контролируете отображаемую страницу html, включите ее там.
Если вам нужно интерфейс обратно из javascript, вы можете это сделать. Для более интенсивного обмена командами используйте CordovaWebView
- интерфейс, который имеет более низкую задержку в зависимости от уровня api.