我正在创建一个Android应用程序,我通过服务器验证用户名/密码。最初服务器正在实施Basic
身份验证,因此我的代码工作正常,但现在服务器已更改为Digest
身份验证,因此我的旧代码无效。
使用Digest
身份验证应该做些哪些更改?
我的代码如下:
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<String> 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<Cookie> 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()));
}
答案 0 :(得分:15)
您需要使用所需的凭据创建HttpHost
和HttpContext
对象,并将其赋予执行方法。
这是一个示例代码,其中您的身份验证独立于后端身份验证。 android的http客户端将负责将其转换为适当的格式。请查看此示例代码,这仅供您参考,不能直接在您的代码中使用。 :)
此代码在您的活动中:
@Override
public void onResume(){
super.onResume();
AsyncTask<String, Void, Void> httpTask = new TestHttpThread();
httpTask.execute("test_url","test_user","test_password");
}
示例AsyncActivity
:
private class TestHttpThread extends AsyncTask<String, Void, Void>{
@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;
}
}