簡體   English   中英

正確使用HttpRequestInterceptor和CredentialsProvider進行HttpClient的搶占式身份驗證

[英]Proper use of HttpRequestInterceptor and CredentialsProvider in doing preemptive authentication with HttpClient

我正在Android中編寫一個應用程序,它消耗了我創建的一些REST服務。 這些Web服務未發布標准的Apache Basic質詢/響應。 而是在服務器端代碼中,我想要從HTTP(S)請求中查詢用戶名和密碼,並將其與數據庫用戶進行比較,以確保它們可以運行該服務。

我正在使用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);
                }
            }
        }
    };

所以問題就是這個。 適當使用它會是什么? 當應用程序啟動時,我會將其作為應用程序的一部分進行旋轉嗎? 將用戶名和密碼從內存中拉出來,然后使用它們創建這個CredentialsProvider然后由HttpRequestInterceptor使用? 或者有沒有辦法更動態地做到這一點?

HttpClient非常不喜歡先發制人認證。

如果您的REST API支持BASIC身份驗證,那么自己輸入正確的標頭可能更簡單。 這是一個使用Twitter API的Twitter客戶端示例 ,它使用了這種技術。

沒關系,我發現了什么是錯的。 我再看一下Apache的例子,並意識到我在創建我正在使用的HttpHost對象時沒有傳遞“http”。 這完全不相關。 啊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM