使用HttpUrlConnection进行抢占式基本身份验证?

Dav*_*ims 38 java authentication android http basic-authentication

使用HttpUrlConnection使用抢占式基本http身份验证的最佳方法是什么.(现在假设我不能使用HttpClient).

编辑澄清:我正在使用Base64编码在请求标头中正确设置un/pw.是否需要设置任何其他标志或属性,或者我是否为抢先式基本身份验证所需的所有请求设置基本身份验证头?

don*_*ata 101

如果您使用的是Java 8或更高版本,java.util.Base64则可以使用:

HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
String encoded = Base64.getEncoder().encodeToString((username+":"+password).getBytes(StandardCharsets.UTF_8));  //Java 8
connection.setRequestProperty("Authorization", "Basic "+encoded);
Run Code Online (Sandbox Code Playgroud)


然后正常使用连接.

如果您使用的是Java 7或更低版​​本,则需要一种方法将String编码为Base64,例如:

byte[] message = (username+":"+password).getBytes("UTF-8");
String encoded = javax.xml.bind.DatatypeConverter.printBase64Binary(message);
Run Code Online (Sandbox Code Playgroud)

是的,这就是使用Basic Auth所需要做的一切.设置请求属性的上述代码应在打开连接后和获取输入或输出流之前立即完成.

  • 对于使用android.util.Base64对此进行编码的任何人来说,只需要一点警告DEFAULT标志会附加换行符,从而为您创建无效的HTTP请求,这会让您浪费时间来弄清楚为什么会出现HTTP像nginx这样的服务器报告您的请求的HTTP 400错误代码!因此,请确保使用NO_WRAP标志! (36认同)
  • 上面的代码对我不起作用.这工作:`String encoded = Base64.encodeToString((username +":"+ password).getBytes("UTF-8"),Base64.NO_WRAP); connection.setRequestProperty("授权","基本"+编码);`注意我只使用`Base64.encode`没有成功(即没有'encodeToString'),因为它产生了一些奇怪的结果字节,其ASCII表示没有甚至类似于Base64. (10认同)
  • 浪费时间:2 :) (6认同)