正确使用 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 扩展包