在httpAuthHandler使用正确的用户名/密码对继续进行处理后,如何使Android webview保存的令牌无效?

时间:2019-02-27 19:39:40

标签: android authentication webview basic-authentication http-authentication

我有一个Webview的实现,其中我正在使用API​​ loadUrl(url)加载URL。服务器进行身份验证检查,因此服务器发送401作为响应,并由 onReceivedHttpAuthRequest(WebView视图,HttpAuthHandler处理程序,字符串主机,字符串领域)处理。

WebView正在使用第一个401响应的正确实现来响应。在此响应之后,WebView将存储一个身份验证令牌,该令牌将用于后续请求。

有什么方法可以使已保存的令牌无效?

1 个答案:

答案 0 :(得分:0)

我找到了一种方法,每次loadUrl尝试连接到服务器时,都会对用户名/密码对进行身份验证。

您应该使用loadUrl(String url, Map<String, String> additionalHttpHeaders)。此方法接受一个URL和要与相应URL一起发送的AdditionalHttpHeaders。

例如,出于基本身份验证的目的,WebView可以使用以下步骤提交授权标头:

  1. 创建一个用冒号(:)分隔的用户名和密码字符串。例如username:password
  2. 使用Base64对该字符串进行编码。
  3. 在其中key =“ Authorization”和value = result of step 2的映射中添加键/值对。
  4. 使用上述 loadUrl 方法使用网址提交地图。

我正在添加以下代码,以供其他开发人员了解我的解决方案:

@Override
protected void onResume() {
    super.onResume();
    final WebView webView = findViewById(R.id.webview);
    webView.setWebViewClient(new WebViewClient());
    doWebSettings(webView);
    webView.loadUrl(**url you want to load**, getBasicHeader());
}

private void doWebSettings(WebView webView) {
    ***These are example WebSettings**
    final WebSettings webSettings = webView.getSettings();
    webSettings.setAllowFileAccess(true);
    webSettings.setAllowFileAccessFromFileURLs(true);
    webSettings.setJavaScriptEnabled(true);
    webSettings.setAllowUniversalAccessFromFileURLs(true);
}

private Map getBasicHeader() {
    Map<String, String> additionalHeader = new HashMap();
    additionalHeader.put("Authorization", "Basic "+ getEncodedString());
    return additionalHeader;
}

private String getEncodedString(String username, String password) {
    final String userpass = username+":"+password;
    return Base64.encodeToString(userpass.getBytes(),
            Base64.DEFAULT);
}

此解决方案将确保每次加载url时,服务器都会检查Additional标头进行身份验证。因此,WebView将不会发送以前的身份验证令牌。如果提供的用户名/密码对不正确,则将调用HttpAuthHandler#proceed,并且将调用默认行为来取消请求。