4

作成したいくつかのRESTサービスを使用するアプリケーションをAndroidで作成しています。これらのWebサービスは、標準のApacheBasicチャレンジ/レスポンスを発行していません。代わりに、サーバー側のコードで、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

気にしないで、私は何が悪いのかを見つけました。Apacheの例をもう一度見てみると、使用しているHttpHostオブジェクトを作成するときに「http」を渡していないことに気付きました。それは完全に無関係でした。うーん。

于 2010-05-07T12:11:22.087 に答える