我正在使用基本身份验证与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);
然后看看fiddler中的请求,我可以像预期的那样看到正文,但显然服务器拒绝了未经授权的请求。
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 );
答案 0 :(得分:2)
只需跟进我的评论即可获得解决方案。
在大多数情况下,我发现当Auth标头中的base64编码的String无效时,服务器往往表现得很奇怪。因此,请验证授权标头是否正确。
一般来说,最好先尝试卷曲这类东西。以下是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 );
我应该注意到第一次出现但无论如何,我很高兴我的第一次想到会得到你的答案: - )