当我们有冗长的密码时,我们遇到了HttpURLConnection + Basic身份验证的问题。
以下是样本代码:
URL url = new URL("http://localhost/data.json");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod(method);
String authString = clientId + ":" + clientSecret;
BASE64Encoder encoder = new BASE64Encoder();
String authHeader = encoder.encode(authString.getBytes());
conn.setRequestProperty("Authorization", authHeader);
conn.setRequestProperty("Accept", "application/json");
我们尝试使用
String authString = clientId + ":" + clientSecret;
authString = "" + javax.xml.bind.DatatypeConverter.printBase64Binary(authString.getBytes());
但是没有运气。
HttpURLConnection与Basic Auth一起使用一定长度的密码,但是我们有问题。返回的错误代码是400
注意:这与使用Paypal集成登录https://developer.paypal.com/webapps/developer/docs/integration/direct/log-in-with-paypal/detailed/#making-first-call
有关我们拥有的示例代码(由PayPal提供)也无效。
提前谢谢。
答案 0 :(得分:1)
我遇到的问题是由于用户名,密码很长。
如果我使用下面的代码,它可以正常工作
byte[] encodedBytes = org.apache.commons.codec.binary.Base64.encodeBase64(passwordString.getBytes("UTF-8"));
String encodedString = new String(encoded, "UTF-8");
和
headers.put(“授权”,“基本”+ encodedString);
答案 1 :(得分:0)
尝试发布。
如果您使用本地服务器对此进行测试,请确保它对最大URL大小,最大参数长度,最大POST标头大小等没有任何限制。检查服务器端日志。
这可能不是问题,但是这个语句中有一个可能的错误“authString.getBytes()”。您正在根据系统默认编码将字符串转换为字节,这取决于JVM / OS / Locale--您应该将显式编码传递给getBytes()。
答案 2 :(得分:0)
您应该检查成功的身份验证,即。使用具有请求检查器(即chrome)的web浏览器或仅使用wireshark。
因此,您可以看到向服务器发送了哪种请求消息。
从这一点开始,您可以检查您的代码是否提供了相同类型的请求,如果它们不相同,您至少可以找到错误的内容。
虽然即使没有基本身份验证长度的规范限制,但仍存在一些与平台相关的限制,如下所述:Is there a practical HTTP Header length limit?
希望你觉得它很有用。