4

我正在使用我创建的一些 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 使用?或者有没有办法更动态地做到这一点?

4

2 回答 2

1

HttpClient 不太喜欢抢先式身份验证。

如果您的 REST API 支持 BASIC 身份验证,那么自己放入正确的标头可能会更简单。这是一个使用 Twitter API 的示例 Twitter 客户端,它使用了这种技术。

于 2010-05-07T11:50:18.657 回答
0

Nevermind, I found out what was wrong. I took another look at the Apache examples and realized that I wasn't passing along the "http" when creating the HttpHost object I was using. It was completely unrelated. Ugh.

于 2010-05-07T12:11:22.087 回答