Android WebView с https подключением и основной авторизации. Как заставить это работать? - PullRequest
16 голосов
/ 20 января 2012

Я исследовал и исследовал это, пока не стал седым и лысым.Как, черт возьми, заставить веб-просмотр работать на сайте, который нуждается в базовой аутентификации http через соединение https на уровне API 8 +

У меня есть следующий код

    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);

Как вы можетевидите, у меня действительно был клиент веб-представления (теперь закомментированный), который переопределяет метод onReceivedHttpAuthRequest, который выглядит следующим образом:

@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);
    }
}

. Он был использован без webview.setHttpAuthUsernamePassword и работает нормально, за исключением того, что это означает, что были выполнены 2 запроса.на сайт - сначала получает 401, а затем клиент запускает с авторизацией материала. Это хорошо для небольшого количества трафика сайта, но вдвое меньше трафика (в настоящее время в среднем 49 запросов в месяц) это название игрыпрямо сейчас!

Я прочитал, что могу предварительно предоставить учетные данные, используя

webview.setHttpAuthUsernamePassword(Config.SERVER_BASE_URL, "Application", email, pwd);

Однако это просто приводит к Http Basic: ошибки запрещенного доступа Базовая константа URL сервера является доменомназвание сайта, т.е. https://example.com (без страницы), фактический URL-адрес https://example.com/some_pages.Не имеет значения, использую ли я полный URL или домен.Я проверил область, и у меня это правильно, и я использовал только пустые строки, предоставляя только электронную почту и пароль.Может ли это быть связано с тем, что сайт использует https?Кажется, мой код работает нормально на моем устройстве dev без https, но это может быть красная сельдь.!

Единственные вопросы о переполнении стека, которые, как представляется, охватывают мои требования, не получили принятых ответов, и документы не помогают.Я вижу.

Теперь у меня в голове такая большая вмятина от удара о кирпичную стену, что я думаю получить квадратную шляпу.

Пожалуйста, если кто-нибудь может дать мнеРешением этой проблемы я навсегда останусь в вашем долгу!Я мог бы даже отправить вам KitKat по электронной почте

Ответы [ 3 ]

16 голосов
/ 24 января 2012

Этот простой пример злоупотребляет страницей на HttpWatch , поскольку с рабочим публичным примером это веселее.

Рассматриваемый ресурс <a href="https://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx?randomgarbage" rel="noreferrer">https://www.httpwatch.com/httpgallery/authentication/authenticatedimage/default.aspx?randomgarbage</a> использует базовую аутентификацию через HTTPS и может быть загруженбез сбоя аутентификации, как это (протестировано с использованием 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) {}

Это работает на ICS и Gingerbread.У меня нет доступа к чему-то более старому, чем это, но loadUrl(String, Map<String,String>) было введено на уровне API 8, поэтому я не понимаю, почему это не должно работать для этого.

Разъяснение для Nappy:

Для поддержки аутентификации для последующих запросов вы вводите WebViewClient и делаете следующее:

    webView.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url, <your map containing the Authorization header>);
            return true;
        }
    });
1 голос
/ 25 января 2012

Это будет работать для https URL. В этом случае, если мы получим Untrusted_cer, мы проигнорируем его

 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();
            }
        }

    });

Понятия не имею о второй проблеме

0 голосов
/ 07 сентября 2015

для обработки авторизации на вашем сайте, просто переопределите следующий метод в вашем webViewClient и добавьте имя пользователя и пароль в его обработчик.

@Override
        public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
            handler.proceed(StringUtils.AUTH_NAME,StringUtils.AUTH_PASS);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...