0

基本認証を使用して Android の Web サービスと通信しています。これは、次のようなヘッダーを送信していることを意味します

Authorization Basic [user:pass base 64 string here]

リクエストを次のように設定しています。

public CreateUserService(Intent intent, int id) throws UnsupportedEncodingException {
    super(id);
    List<NameValuePair> params = new ArrayList<NameValuePair>();

    params.add(new BasicNameValuePair("email", intent.getStringExtra(FeedIntentService.EXTRA_UID)));
    //and so on.

    setupRequest(null, params);
}

そして、スーパークラスにはメソッドがあります

protected void setupRequest(List<Header> headers, List<NameValuePair> params) throws UnsupportedEncodingException {
    mRequest = new HttpPost(getUri());
    mRequest.addHeader(new BasicHeader("Authorization", "Basic " + AUTH_STRING));
    //AUTH_STRING = the base 64 encoded user:pass pair
    if(headers!=null) {
        for(Header h: headers) {
            mRequest.addHeader(h);
        }
    }
    if(params!=null)
        ((HttpEntityEnclosingRequestBase) mRequest).setEntity(new UrlEncodedFormEntity(params));
}

問題は、サーバーがリクエスト本文を受信して​​いないことです。フィドラーでリクエストを読みましたが、実際に欠落しているようです。ただし、行を削除すると

    mRequest.addHeader(new BasicHeader("Authorization", "Basic " + AUTH_STRING);

フィドラーでリクエストを見ると、明らかにサーバーが無許可のリクエストを拒否しているにもかかわらず、私が期待したとおりに本文を見ることができます。

AUTH_STRING は次のようにエンコードされています。

private static final String APP_KEY = "user";
private static final String APP_SECRET = "pass";
private static final String APP_STRING = APP_KEY + ":" + APP_SECRET;
private static final String APP_BASE_64 = Base64.encodeToString( APP_STRING.getBytes() , Base64.DEFAULT );
4

1 に答える 1

2

あなたの解決策につながる私のコメントをフォローアップするだけです。

ほとんどの場合、Auth ヘッダーの base64 でエンコードされた文字列が無効な場合、サーバーが奇妙な動作をする傾向があることがわかりました。そのため、Authorization ヘッダーが正しいことを確認してください。

一般に、最初に curl でこの種のことを試すのが常に最善です。以下は、curl を使用したコマンドの例です。

curl -X POST -H "Authorization: Basic <base64-encoded String>" http://some.server.url.com/some-endpoint

それを修正するためにトリム()を追加したようです。実際の解決策は、Base64.NO_WRAP ( http://developer.android.com/reference/android/util/Base64.html#NO_WRAP ) を使用することです。したがって、エンコード時にこれを行う必要があります。

Base64.encodeToString( APP_STRING.getBytes() , Base64.NO_WRAP );

おそらく最初に気づいたはずですが、いずれにせよ、私の最初の考えがあなたの答えにつながってうれしいです:-)

于 2013-04-17T17:31:30.910 に答える