vista web android con conexión https y autenticación básica. ¿Cómo conseguir este trabajo?
He investigado y investigado e investigado esto hasta que he ido gris y calvo. ¿Cómo debo conseguir una webview para trabajar en un sitio que necesita la autenticación básica http sobre una conexión https en un nivel de api 8+
Tengo el siguiente código
- La vista web de Android o el navegador no borran las cookies de sesión en el reinicio del dispositivo
- WebView detectar clic en iframe
- Deshabilitar Android WebView / WebViewClient Iniciado favicon.ico Solicitar
- Android: evitar la recarga de WebView en rotación
- Métodos de WebView en el mismo error de hilo
String email = Util.getEmail(this); String pwd = Util.getPassword(this); webview.getSettings().setJavaScriptEnabled(true); webview.setHttpAuthUsernamePassword(Config.SERVER_BASE_URL, "Application", email, pwd); // webview.setWebViewClient(new MobileWebViewClient(this)); webview.loadUrl(url);
Como usted puede ver que tenía un cliente de la visión de la tela (ahora comentado hacia fuera) que anula el método onReceivedHttpAuthRequest que parece esto
@Override public void onReceivedHttpAuthRequest (WebView view, HttpAuthHandler handler, String host, String realm){ String email = Util.getEmail(wvContext); String pwd = Util.getPassword(wvContext); if(!pwd.equalsIgnoreCase("-1") && !pwd.equalsIgnoreCase("-1")){ handler.proceed(email, pwd); } }
Esto se utilizó sin la webview.setHttpAuthUsernamePassword y funciona bien, excepto que significa que 2 solicitudes se publican en el sitio web – El primero recibe un 401 y luego el cliente entra en acción con la autorización de cosas Esto está bien para una pequeña cantidad de tráfico del sitio web, la cantidad de tráfico (en la actualidad el promedio de 49 solicitudes p / m) es el nombre del juego ahora mismo!
He leído que puedo suministrar las credenciales de forma preemptiva utilizando
webview.setHttpAuthUsernamePassword(Config.SERVER_BASE_URL, "Application", email, pwd);
Sin embargo, esto sólo resulta en Http Básico: Errores de acceso denegado La constante de url de base de servidor es el nombre de dominio para el sitio, es decir, https://example.com (sin la página) la url real es https://example.com/some_pages . No importa si uso la url completa o el dominio. He comprobado el reino y tengo eso correcto y he utilizado apenas las cadenas vacías que proporcionan solamente email y contraseña. ¿Podría esto ser algo hacer con el hecho de que el sitio está utilizando https? Mi código parece funcionar bien en mi caja de dev sin https, pero que puede ser un arenque rojo.!
Las únicas preguntas de desbordamiento de pila que parecen cubrir mis necesidades no han recibido respuestas aceptadas y los documentos no son una ayuda que pueda ver.
Tengo ahora una abolladura tan grande en mi cabeza de golpearla contra una pared de ladrillo que estoy pensando de conseguir un sombrero cuadrado.
Por favor, si alguien puede darme la solución a esto voy a estar para siempre en su deuda! Incluso podría enviarle un KitKat por correo electrónico
- Error de puerto USB de depuración de puertos USB
- Método restorePicture de WebView - Impedir que la vista web vuelva a cargar la página
- Tire para actualizar para WebView
- ExceptionInInitializerError en la aplicación de Android?
- Bloquear los anuncios de los que aparecen en la vista web de Android
- ¿Cómo implementar CordovaInterface para que pueda usar la cámara en la webview?
- Android WebView personalizado no logra encontrar funciones de javascript definidas en HTML cargado
- Mejor vista para mostrar imágenes y contenido html en android
Este ejemplo simple abusa de una página en HttpWatch ya que es más divertido con un ejemplo público que funciona.
El recurso en cuestión, https://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx?randomgarbage
utiliza autenticación básica sobre HTTPS y se puede cargar sin fallos de autenticación como este (probado con Android 2.3.7):
WebView v = ...; // Your webview goes here. try { HashMap<String, String> map = new HashMap<String, String>(); // This test service takes the username "httpwatch" and a random // password. Repeating a password can lead to failure, so we create // a decently random one using UUID. String usernameRandomPassword = "httpwatch:" + UUID.randomUUID().toString(); String authorization = "Basic " + Base64.encodeToString(usernameRandomPassword.getBytes("UTF-8"), Base64.NO_WRAP); map.put("Authorization", authorization); v.loadUrl("https://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx?" + System.currentTimeMillis(), map); } catch (UnsupportedEncodingException e) {}
Esto funciona en ICS y Gingerbread. No tiene acceso a nada más antiguo, pero loadUrl(String, Map<String,String>)
fue introducido en el nivel 8 de la API, por lo que no veo por qué no debería funcionar para eso.
Aclaración para el pañal:
Para admitir la autenticación para solicitudes posteriores, proporcione un WebViewClient
y realice lo siguiente:
webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url, <your map containing the Authorization header>); return true; } });
Funcionará para la URL de https. En esto si estamos consiguiendo Untrusted_cer entonces lo ignoraremos
webview.setWebViewClient(new WebViewClient(){ @Override public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { super.onReceivedHttpAuthRequest(view, handler, host, realm); } @Override public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { super.onReceivedSslError(view, handler, error); if(error.getPrimaryError()==SslError.SSL_UNTRUSTED){ handler.proceed(); }else{ handler.proceed(); } } });
No tengo ni idea sobre el segundo problema
para manejar la autorización en su sitio, simplemente anule el siguiente método en su webViewClient y agregue el nombre de usuario y la contraseña en su manejador.
@Override public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) { handler.proceed(StringUtils.AUTH_NAME,StringUtils.AUTH_PASS); }
- Despliegue de SVN y sintaxis en Android
- android: ¿Actualizar los elementos de ActionBar dependiendo de cada Fragmento en un ViewPager?