2010-05-07 65 views
3

我在Android中編寫了一個應用程序,它使用了我創建的一些REST服務。這些Web服務不會發布標準的Apache Basic挑戰/響應。而是在服務器端代碼中,我想詢問來自HTTP(S)請求的用戶名和密碼,並將其與數據庫用戶進行比較,以確保他們可以運行該服務。正確使用HttpRequestInterceptor和CredentialsProvider與HttpClient進行搶先認證

我正在使用HttpClient做到這一點,我有初始登錄後存儲在客戶端的憑據(至少這是我看到這個工作)。所以這裏是我卡住的地方。 HttpClient下的搶先認證要求你設置一個攔截器作爲靜態成員。這是Apache Components使用的示例。

HttpRequestInterceptor preemptiveAuth = new HttpRequestInterceptor() { 
     @Override 
     public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException { 
      AuthState authState = (AuthState) context.getAttribute(ClientContext.TARGET_AUTH_STATE); 
      CredentialsProvider credsProvider = (CredentialsProvider) context.getAttribute(
        ClientContext.CREDS_PROVIDER); 
      HttpHost targetHost = (HttpHost) context.getAttribute(ExecutionContext.HTTP_TARGET_HOST); 

      if (authState.getAuthScheme() == null) { 
       AuthScope authScope = new AuthScope(targetHost.getHostName(), targetHost.getPort()); 
       Credentials creds = credsProvider.getCredentials(authScope); 
       if (creds != null) { 
        authState.setAuthScheme(new BasicScheme()); 
        authState.setCredentials(creds); 
       } 
      } 
     } 
    }; 

所以問題就在於此。這將適當使用什麼?當應用程序啓動時,我會將它作爲應用程序的一部分嗎?將用戶名和密碼拉出內存,然後使用它們來創建此HttpRequestInterceptor使用的CredentialsProvider?還是有辦法更動態地做到這一點?

回答

2

HttpClient不太喜歡搶先認證。

如果您的REST API支持BASIC身份驗證,那麼只需要自己輸入正確的頭文件可能會更簡單。 Here is a sample Twitter client,使用Twitter API,使用這種技術。

+0

我得到它沒有搶先認證工作。結果是答案。謝謝。 – 2010-05-09 01:47:59

0

沒關係,我發現出了什麼問題。我又看了一遍Apache的例子,發現我在創建我使用的HttpHost對象時沒有傳遞「http」。這完全不相關。啊。

相關問題