繁体   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