gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 08:03:07 25 4
gpt4 key购买 nike

我在基于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com