2011-07-15 10 views
14

Tworzę aplikację dla systemu Android, na której uwierzytelniam nazwę użytkownika/hasło za pośrednictwem serwera. Początkowo serwer implementował uwierzytelnianie Basic, więc mój kod działał poprawnie, ale teraz serwer zmienił się na Digest uwierzytelnianie, więc mój stary kod nie działa.jak korzystać z uwierzytelniania Digest w systemie Android?

Jakie zmiany należy wprowadzić, aby skorzystać z uwierzytelniania Digest?

Mój kod wygląda następująco:

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

adres URL nie działa –

+0

@scorpio Ten adres URL nie jest prawdziwa. – AB1209

Odpowiedz

15

Trzeba stworzyć HttpHost i HttpContext obiekt z wymaganych poświadczeń i przekazać go do realizacji metody.

To przykładowy kod, w którym uwierzytelnienie jest niezależne od autoryzacji zaplecza. klient http androida zajmie się jego konwersją do odpowiedniego formatu. Sprawdź ten przykładowy kod, to tylko w celach informacyjnych i nie należy go używać bezpośrednio w kodzie. :)

Ten kod jest w swojej działalności:

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

Próbka 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; 
    } 
} 
+0

Po uruchomieniu otrzymuję WYJĄTKĘ "Wątek ten zabrania żądań HTTP" Co mogę zrobić w tej sytuacji Proszę pomóc – AB1209

+0

musisz wykonać tę prośbę w wątku głównym lub wątku interfejsu użytkownika. powinieneś wykonać kod w zadaniu asynchronicznym lub w usłudze – Naresh

+0

Zaktualizowany kod z nowym kodem ... tworzenia http w asynchronicznym zadaniu – Naresh

Powiązane problemy