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

时间:2011-07-15 08:47:40

标签: android

我正在创建一个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()));
}

1 个答案:

答案 0 :(得分:15)

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

这是一个示例代码,其中您的身份验证独立于后端身份验证。 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;
    }
}