2011-07-15 14 views
14

私はサーバーでユーザー名とパスワードを認証しているAndroidアプリを作成しています。サーバーはBasicの認証を実装していましたので、私のコードは正常に動作しましたが、サーバーはDigestに変更されています。Androidでダイジェスト認証を使用する方法は?

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

あなたのURLは、このURL @scorpio –

+0

を働いていないことは真実ではありません。 – AB1209

答えて

15

あなたが必要な資格情報を使用してHttpHostHttpContextオブジェクトを作成し、メソッドを実行するためにそれを与える必要があります。

これは、認証がバックエンド認証とは独立しているサンプルコードです。アンドロイドの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; 
    } 
} 
+0

それを使用した後、私は例外を受けています "このスレッドはHTTP要求を禁止します" この状況で何ができるのですか? – AB1209

+0

メインスレッドまたはUIスレッドでこの要求を行う必要があります。非同期タスクまたはサービス内でコードを実行する必要があります – Naresh

+0

非同期タスクでhttpを作成する新しいコードでコードを更新しました – Naresh

関連する問題