如何在android中使用摘要式身份validation?

我正在创建一个Android应用程序,我通过服务器validation用户名/密码。最初服务器正在实现Basic身份validation,所以我的代码工作正常,但现在服务器已更改为Digest身份validation,所以我的旧代码无法正常工作。

使用Digest身份validation应该做哪些更改?

我的代码如下:

 private boolean authenticateUser() { try { String url_str = "http://serverweb.com/checkauthentication.php"; HttpPost post = new HttpPost(url_str); Log.v("AUTHENTICATION URL = ", url_str); post.addHeader("Authorization","Basic "+getCredentials()); ResponseHandler responseHandler=new BasicResponseHandler(); String response_body = client.execute(post, responseHandler); Log.v("SERVER RESPONSE DATA = ", response_body); XMLDataParser.parseXML(XMLDataParser.USER_INFORMATION_PARSER_CODE, response_body); List cookies = client.getCookieStore().getCookies(); if (!cookies.isEmpty()) { for (int i = 0; i < cookies.size(); i++) { XMLData.cookie = cookies.get(i); } } return true; } catch (MalformedURLException mue) { Log.i("MalformedURLException", " "+mue.getMessage()); displayDialog("User Does Not exist"); return false; } catch (IOException ioe) { Log.i("IOException", " "+ioe.getMessage()); displayDialog("User Does Not exist"); return false; } catch (Exception e) { Log.i("Exception", " "+e.getMessage()); displayDialog("Error"); return false; } } private String getCredentials() { String u=edit_username.getText().toString(); String p=edit_password.getText().toString(); Log.v("USER NAME = ",u); Log.v("PASSWORD = ",p); return(Base64.encodeBytes((u+":"+p).getBytes())); } 

您需要使用所需的凭据创建HttpHostHttpContext对象,并将其赋予执行方法。

这是一个示例代码,其中您的身份validation独立于后端身份validation。 android的http客户端将负责将其转换为适当的格式。 查看此示例代码,这仅供您参考,不能直接在您的代码中使用。 🙂

此代码在您的活动中:

 @Override public void onResume(){ super.onResume(); AsyncTask httpTask = new TestHttpThread(); httpTask.execute("test_url","test_user","test_password"); } 

示例AsyncActivity

 private class TestHttpThread extends AsyncTask{ @Override protected Void doInBackground(String... params) { if(params.length > 0){ String url = params[0]; String username = params[1]; String password = params[2]; try { AndroidHttpClient httpClient = AndroidHttpClient.newInstance("test user agent"); URL urlObj = new URL(url); HttpHost host = new HttpHost(urlObj.getHost(), urlObj.getPort(), urlObj.getProtocol()); AuthScope scope = new AuthScope(urlObj.getHost(), urlObj.getPort()); UsernamePasswordCredentials creds = new UsernamePasswordCredentials(username, password); CredentialsProvider cp = new BasicCredentialsProvider(); cp.setCredentials(scope, creds); HttpContext credContext = new BasicHttpContext(); credContext.setAttribute(ClientContext.CREDS_PROVIDER, cp); HttpGet job = new HttpGet(url); HttpResponse response = httpClient.execute(host,job,credContext); StatusLine status = response.getStatusLine(); Log.d(TestActivity.TEST_TAG, status.toString()); httpClient.close(); } catch(Exception e){ e.printStackTrace(); } } return null; } }