javascript - 使用带有后台 WebView 的网页抓取的 Android 登录应用程序

标签 javascript android ssl-certificate

我在基于 Web 的 Android 应用程序的登录系统方面遇到问题(与 CA 的 HTTPS 连接,TLS 1.0 128 位密码)。因此,应用程序有自己的登录屏幕/Activity (两个用于用户名和密码的 EditText),并且用户应该能够通过该窗口登录到 Web(不显示 WebView 或类似内容)。然后应用程序将更新其 UI,显示许多功能以及注销/退出按钮。好吧,这里的问题是我没有可用的网络服务来验证用户身份......交易技巧 T_T。

事实是,这是由网站管理员造成的困惑,因为这应该通过网络服务并共享 token / session 数据来完成。如果有一天网络代码被修改了……那么登录肯定会失败。这根本不严肃(或安全的做法)。

另外,我还有另一个问题,因为如果用户输入了一次错误的登录信息,则会出现一个邪恶的验证码。我们可以通过关闭并再次打开浏览器来避免这种情况;每次尝试后。考虑到所有可能性,最“可行”的解决方案包括在网络上抓取 Javascript 代码,填写 URL 登录用户/密码表单字段 (.do) 并将其发送到网络。考虑到流程步骤,我对在 Android 中实现该行为有一些疑问。想法/建议将不胜感激。所以,我们开始......我最初的方法是:

  1. 执行 HTTPS 连接。这应该验证证书。我想过做类似 this 的事情。下载 base64 (.cer) 格式的证书,然后生成 key 并在应用程序中使用它们。两个问题:

    • 如果Web证书过期,是否需要重新生成keystore并重新添加到应用代码中?
    • 是否有办法自动执行此过程,以编程方式下载它们并验证 CA?
  2. 创建一个虚拟 Web View (不显示它)并启用 Javascript。它将用于在网络中注入(inject) .js(用户并从 EditText 字段传递)并使用网络上的提交按钮。加载登录表单所在的 URL 并验证它。问题:

      - 我需要在提交表单后清除 webview 的缓存,包括 cookie,以避免用户重试时出现验证码...在这种特殊情况下,禁用缓存是否足以? (weview.clearCache(true))。我想我需要使用 onPageFinished 方法来使用firstAttemp boolean var 或类似的方法来控制它......

  3. 提交表单后,Javascript 会使用“错误”标签,您可以通过该标签检查登录是否成功。使用 Javascript 接口(interface)查找类标记,如下所示:

    document.getElementsByClassName('error')[0].innerHTML

  4. 如果登录正确,则使用 AES 加密将用户保存在共享数据文件中。

这里有一些代码:

    isSumitted = false;
    String user = editUser.getText().toString();
    String password = editPass.getText().toString();

    // empty fields checking 
    // here we can do other checks (size, characters...)
    // maybe create a LoginFormatException...
    if (user.isEmpty() || password.isEmpty()) {
        Util.alertaAcept(getActivity(), "Error:", getResources()
                .getString(R.string.rellene_usuario_contr));
        return;
    }

    // Authenticate by using a Webview in the background 
    WebView myWebView = new WebView(getActivity());
    WebSettings settings = myWebView.getSettings();       
    settings.setJavaScriptEnabled(true);
    //settings.setSavePassword(false); <--- deprecated
    settings.setSaveFormData(false);
    settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
    settings.setAppCacheEnabled(false);

    // JavaScript to inject in the webview
    final StringBuilder jsCode = new StringBuilder()
    .append("javascript: {")
    .append("document.getElementById('logname')[0].value = '"+ user +"';")
    .append("document.getElementById('passtext')[0].value = '"+ password +"';");
    .append("document.getElementById('Submit').click();");

myWebView.setWebViewClient(new WebViewClient() {
    public void onPageFinished(WebView view, String url) {                  
       if (!isSubmitted) {      
            // if first attempt
            // fill the fields and submit               
            view.loadUrl(jsCode.toString());
            myWebView.loadUrl(URL_ACCESO);
            isSubmitted = true;             
       }else{
            // check if the login was correct               
            // by getting the response from js "document.getElementsByClassName('error')[0].innerHTML;";
            if(errorResponse.equalsIgnoreCase("")){
                 // logged OK
                 logged = true;                  
                  // then encrypt user & pass with proper suites and save the data in the shared preference file:                                                   
             }
              else{
                  // show an AlertDialog with something like "Sorry, you have fail this code" or whatever you want...
                  //now, delete the browser's cache
                  //and delete cached requests or cookies if necessary
             }          
          }         
      });       

最佳答案

关于javascript - 使用带有后台 WebView 的网页抓取的 Android 登录应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25130670/

相关文章:

javascript - 如何用 Javascript 创建一个简单的提示战舰游戏

c# - 从 Web 浏览器控件打开证书信息

java - stunnel - 如何不间断地更换服务器证书

node.js - 无法启动 NodeJS HTTPS 服务器。 v0.10.23

javascript - 模板内容是一个空文档片段

javascript - JavaScript 中的双重或三重(甚至多重)比较

javascript - 在 JavaScript 中初始化 2D 和 3D 数组

java - Android:如何删除数字选择器中的分隔线

java - 如何将BroadcastReceiver中的Intent中的数据复制到Android中的新接收器中?

java - 为什么我无法下载任何网站的任何 html 页面?(我正在使用 android studio)