正确使用 HttpRequestInterceptor 和 CredentialsProvider 使用 HttpClient 进行抢先式身份验证

Posted

技术标签:

【中文标题】正确使用 HttpRequestInterceptor 和 CredentialsProvider 使用 HttpClient 进行抢先式身份验证【英文标题】:Proper use of HttpRequestInterceptor and CredentialsProvider in doing preemptive authentication with HttpClient 【发布时间】:2011-02-16 15:43:59 【问题描述】:

我正在使用我创建的一些 REST 服务在 android 中编写一个应用程序。这些 Web 服务不会发出标准的 Apache Basic 质询/响应。相反,在服务器端代码中,我想从 HTTP(S) 请求中询问用户名和密码,并将其与数据库用户进行比较,以确保他们可以运行该服务。

我正在使用 HttpClient 来执行此操作,并且在初始登录后我将凭据存储在客户端上(至少我认为它是这样工作的)。所以这就是我卡住的地方。 HttpClient 下的抢先式身份验证要求您将拦截器设置为静态成员。这是 Apache 组件使用的示例。

    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 使用?或者有没有办法更动态地做到这一点?

【问题讨论】:

【参考方案1】:

没关系,我发现出了什么问题。我再次查看了 Apache 示例,并意识到在创建我正在使用的 HttpHost 对象时我没有传递“http”。这是完全无关的。呃。

【讨论】:

【参考方案2】:

HttpClient 不太喜欢抢先式认证。

如果您的 REST API 支持 BASIC 身份验证,那么自己放入正确的标头可能会更简单。 Here is a sample Twitter client,使用 Twitter API,使用了这种技术。

【讨论】:

我让它在没有抢先身份验证的情况下工作。原来这就是答案。谢谢。

以上是关于正确使用 HttpRequestInterceptor 和 CredentialsProvider 使用 HttpClient 进行抢先式身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何正确使用 Composer 安装 Laravel 扩展包

如何正确使用 Composer 安装 Laravel 扩展包

如何正确强制正确使用类方法?

如何正确使用 Composer 安装 Laravel 扩展包

C#注释的正确的使用方法有哪些?

如何正确的使用QWebEngineView