0

我正在使用基本身份验证与 Android 中的网络服务交谈。这意味着我发送的标题看起来像

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 Header 是否正确。

一般来说,最好先用 curl 尝试这些东西。以下是带有 curl 的示例命令

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

我看到你添加了 trim() 来修复它。真正的解决方案是使用 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 回答