我有原始Android应用程序示例。用户为用户想要访问的应用程序创建配置文件。根据应用程序设置,用户将被重定向到浏览器中的特定URL进行身份验证或在本机应用程序中显示登录屏幕。如果用户被重定向到浏览器中的URL(我正在使用webview
),我想将响应发送回本机应用程序有关身份验证的状态。我怎么做?如何将侦听器添加到启动BrowserActivity的intent?
答案 0 :(得分:4)
在服务器对WebView
可以检测和分支的身份验证尝试的响应中寻找一致的内容。
例如,Google OAuth会将结果放入HTML响应的<title>
元素中,因此您解析该结果并在WebChromeClient
onReceivedTitle
处理程序中返回对调用活动的响应:
public class MyChrome extends WebChromeClient {
public void onReceivedTitle(WebView view, String title) {
final Intent i = new Intent();
if (title.startsWith("Denied")) {
i.putExtra("auth2code", "");
setResult(RESULT_OK, i);
finish();
} else if (title.contains("code=")) {
final String[] stuff = title.split("=");
if (stuff.length > 1) {
auth2code = stuff[1];
i.putExtra("auth2code", auth2code);
} else {
i.putExtra("auth2code", "");
}
setResult(RESULT_OK, i);
finish();
}
}
}
(在onCreate
中你需要说webView.setWebChromeClient(new MyChrome());
)
此示例显示了基本方法,但必须根据任何给定服务实际响应身份验证尝试的方式进行修改。
答案 1 :(得分:2)
为此,首先在活动中构建WebView客户端,如上所述。
接下来,使用startActivityForResult
启动活动,以便从WebView客户端获取所需的数据。
接下来,在webview Activity中,设置一个Javascript桥:
https://labs.mwrinfosecurity.com/blog/2014/06/12/putting-javascript-bridges-into-android-context/
然后,您可以使用Javascript将结果网页中的数据传递给您的活动。根据传入的数据,您可以使用一种方法,从网页,表单等返回您想要的任何值。
身份验证状态是您可以传递的一件事,但使用Javascript桥接器,您可以执行更多操作。
答案 2 :(得分:2)
我使用JSON将本机Android应用与服务器进行通信。
/**
* Represents an asynchronous login/registration task used to authenticate
* the user.
*/
public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
@Override
protected Boolean doInBackground(Void... params) {
//Comunicate HttpClient object to communicate with the server
HttpClient comunicacion = new DefaultHttpClient();
//Create a new POST request with the URL of the server service
HttpPost peticion = new HttpPost(URL);
try
{
String idEnviado = String.valueOf(System.currentTimeMillis());
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
nameValuePairs.add(new BasicNameValuePair("action", "login"));
nameValuePairs.add(new BasicNameValuePair("id", idEnviado));
nameValuePairs.add(new BasicNameValuePair("email", mEmail));
nameValuePairs.add(new BasicNameValuePair("password", mPassword));
peticion.setEntity(new UrlEncodedFormEntity(nameValuePairs));
peticion.setHeader("Accept", "application/json");
//Execute request and obtain response as a string
HttpResponse respuesta = comunicacion.execute(peticion);
String respuestaString = EntityUtils.toString(respuesta.getEntity());
//JSONObject to read the attributes of the response
JSONObject respuestaJSON = new JSONObject(respuestaString);
//The server answers authentication is valid
if (respuestaJSON.get("result").equals("true"))
{
idUsuario = respuestaJSON.getString("userId");
insertarUsuarioEnBD(idUsuario);
return true;
}
else
{
return false;
}
} catch(Exception e) {
Log.e("Error", "Error in server response.", e);
}
return false;
}
当你从eclipse创建一个至少4.0.0或更高版本的新应用时,它可以让你选择一个新的LoginActivity,几乎完全实现了,并向你显示正确的在Android应用程序中进行身份验证的方法。
我希望这有帮助!
答案 3 :(得分:1)
WebViewClient.shouldOverrideUrlLoading
即将加载网址时,会调用 WebView
。您可以覆盖此方法,并在用户在身份验证后重定向到指定的URL时采取相应措施。
可在此处找到一个简单示例:https://github.com/nguyenhuy/buffer/blob/master/buffer/src/main/java/org/nguyenhuy/buffer/fragment/OAuthFragment.java
答案 4 :(得分:1)
如果授权页面是您自己的网络资源,您也可以使用WebView回调,通过网页JavaScript到Android,如下所述: http://blog.objectgraph.com/index.php/2012/03/16/android-development-javascript-bridge-example-fully-explained/
并将数据从网页传回原生Android应用程序。
答案 5 :(得分:0)
如果您使用nodejs作为服务,则可以使用res.send( {data: successfulLogin} );
或类似的东西。然后解析它,使用你想要的地方。