как использовать дайджест аутентификацию в андроиде? - PullRequest
14 голосов
/ 15 июля 2011

Я создаю приложение для 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 Ответ

15 голосов
/ 28 июля 2011

Вам необходимо создать объект HttpHost и HttpContext с необходимыми учетными данными и предоставить его для выполнения метода.

Это пример кода, где ваша аутентификация не зависит от аутентификации бэкэнда.http-клиент android позаботится о преобразовании его в соответствующий формат.Проверьте этот пример кода, это только для справки и не должно использоваться непосредственно в вашем коде.:)

Этот код в вашей деятельности:

@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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...